///////////////////////////////////////////////////////
//                                                   //
//                 Alexander Haley's                 //
//                   Golden Spike                    //
//                  Pinball Machine                  //
//                                                   //
//                DMD Display Arduino                //
//                                                   //
//             (c) Alexander Haley 2021              //
//              Last updated: 5/2/2021               //
//                                                   //
//                   Build:  0050                    //
//                                                   //
///////////////////////////////////////////////////////
//Notes:

//TODO:
//Everything
//Move the grayscale bars into a test function
//Remove all of the unused, commented out stuff.
//Partial (ex 1/2) coins inserted message
//Commas on locations to be reached?

//Changes:
//Literally one word is different on the match

/////////////////////////////////////
//                                 //
//  Operator-Adjustable Settings   //
//                                 //
/////////////////////////////////////

//No settings yet

/////////////////////////////////////
//                                 //
//        ASCII definitions        //
//                                 //
/////////////////////////////////////

//Not hooking this up to a printer, so I don't need chars 0-31
#define ASCII_SPACE             32   //
#define ASCII_EXCLAMATION_MARK  33   // !
#define ASCII_DOUBLE_QUOTE      34   // "
#define ASCII_HASHTAG           35   // #
#define ASCII_DOLLAR_SIGN       36   // $
#define ASCII_PER_CENT_SIGN     37   // %
#define ASCII_AMPERSAND         38   // &
#define ASCII_SINGLE_QUOTE      39   // '
#define ASCII_OPEN_PARENTHESES  40   // (
#define ASCII_CLOSE_PARENTHESES 41   // )
#define ASCII_ASTERISK          42   // *
#define ASCII_PLUS              43   // +
#define ASCII_COMMA             44   // ,
#define ASCII_HYPHEN            45   // -
#define ASCII_PERIOD            46   // .
#define ASCII_SLASH             47   // /
#define ASCII_ZERO              48   // 0
#define ASCII_ONE               49   // 1
#define ASCII_TWO               50   // 2
#define ASCII_THREE             51   // 3
#define ASCII_FOUR              52   // 4
#define ASCII_FIVE              53   // 5
#define ASCII_SIX               54   // 6
#define ASCII_SEVEN             55   // 7
#define ASCII_EIGHT             56   // 8
#define ASCII_NINE              57   // 9
#define ASCII_COLON             58   // :
#define ASCII_SEMICOLON         59   // ;
#define ASCII_LESS_THAN         60   // <
#define ASCII_EQUAL             61   // =
#define ASCII_GREATER_THAN      62   // >
#define ASCII_QUESTION_MARK     63   // ?
#define ASCII_AT_SYMBOL         64   // @
#define ASCII_UPPERCASE_A       65   // A
#define ASCII_UPPERCASE_B       66   // B
#define ASCII_UPPERCASE_C       67   // C 
#define ASCII_UPPERCASE_D       68   // D
#define ASCII_UPPERCASE_E       69   // E
#define ASCII_UPPERCASE_F       70   // F
#define ASCII_UPPERCASE_G       71   // G
#define ASCII_UPPERCASE_H       72   // H
#define ASCII_UPPERCASE_I       73   // I
#define ASCII_UPPERCASE_J       74   // J
#define ASCII_UPPERCASE_K       75   // K
#define ASCII_UPPERCASE_L       76   // L
#define ASCII_UPPERCASE_M       77   // M
#define ASCII_UPPERCASE_N       78   // N
#define ASCII_UPPERCASE_O       79   // O
#define ASCII_UPPERCASE_P       80   // P
#define ASCII_UPPERCASE_Q       81   // Q
#define ASCII_UPPERCASE_R       82   // R
#define ASCII_UPPERCASE_S       83   // S
#define ASCII_UPPERCASE_T       84   // T
#define ASCII_UPPERCASE_U       85   // U
#define ASCII_UPPERCASE_V       86   // V
#define ASCII_UPPERCASE_W       87   // W
#define ASCII_UPPERCASE_X       88   // X
#define ASCII_UPPERCASE_Y       89   // Y
#define ASCII_UPPERCASE_Z       90   // Z
#define ASCII_OPENING_BRACKET   91   // [
#define ASCII_BACKSLASH         92   // \\           //Apparently the backslash comments out the line after, a space after it fixes that though
#define ASCII_CLOSING_BRACKET   93   // ]
#define ASCII_CARET             94   // ^
#define ASCII_UNDERSCORE        95   // _
#define ASCII_GRAVE_ACCENT      96   // `
#define ASCII_LOWERCASE_A       97   // a
#define ASCII_LOWERCASE_B       98   // b
#define ASCII_LOWERCASE_C       99   // c
#define ASCII_LOWERCASE_D       100  // d
#define ASCII_LOWERCASE_E       101  // e
#define ASCII_LOWERCASE_F       102  // f
#define ASCII_LOWERCASE_G       103  // g
#define ASCII_LOWERCASE_H       104  // h
#define ASCII_LOWERCASE_I       105  // i
#define ASCII_LOWERCASE_J       106  // j
#define ASCII_LOWERCASE_K       107  // k
#define ASCII_LOWERCASE_L       108  // l
#define ASCII_LOWERCASE_M       109  // m
#define ASCII_LOWERCASE_N       110  // n
#define ASCII_LOWERCASE_O       111  // o
#define ASCII_LOWERCASE_P       112  // p
#define ASCII_LOWERCASE_Q       113  // q
#define ASCII_LOWERCASE_R       114  // r
#define ASCII_LOWERCASE_S       115  // s
#define ASCII_LOWERCASE_T       116  // t
#define ASCII_LOWERCASE_U       117  // u
#define ASCII_LOWERCASE_V       118  // v
#define ASCII_LOWERCASE_W       119  // w
#define ASCII_LOWERCASE_X       120  // x
#define ASCII_LOWERCASE_Y       121  // y
#define ASCII_LOWERCASE_Z       122  // z
#define ASCII_OPENING_BRACE     123  // {
#define ASCII_VERTICAL_BAR      124  // |
#define ASCII_CLOSING_BRACE     125  // }
#define ASCII_EQUIVALENCY_SIGN_TILDE 126  // ~
#define ASCII_DELETE            127  // <-

#define ASCII_COPYRIGHT         184  //(c)

/////////////////////////////////////
//                                 //
//        General Variables        //
//                                 //
/////////////////////////////////////

//display master buffer (the large one in which images are created)
byte masterbuffer[32][128];
byte LastMasterBuffer[32][128];
byte NewBufferData = 0;

//position in buffer
byte x = 0;
byte y = 0;

unsigned long MathVariable = 0;
unsigned long MathVariableTwo = 0;

byte mathx = 0;
byte mathy = 0;

byte whichbuffervar = 0;

byte MultiStringWidth = 0; //Used for centering strings comprised of multiple function calls that may vary in length between executions.
byte CursorX = 0; //Again, used in centering a string that changes

unsigned long CurrentProgramMillis = 0;

unsigned long AssembledPlayerScore = 0;

/////////////////////////////////////
//                                 //
//    Varibles for DMD Sequences   //
//                                 //
/////////////////////////////////////

//Attract Mode stuff
unsigned long LastImageMillis = 0;

byte AttractModeStage = 0;
byte HighScoreSequenceNumber = 1;

unsigned long LastHighScoreShadeMillis = 0;
byte HighScoreShade = 1;
byte HighScoreShadeDirection = 1;

byte HasItHappenedYet = 0; //Has X action happened since the last data transmission was received? Also makes me think of a song by Yes.

byte AttractModeSubState = 0;
unsigned long AttractModeSubStateMillis = 0;

byte CountdownBegunYet = 0; //May not work if a image sequence frequently gets new data
unsigned long CountdownMillis = 0;

//Generic
byte ModeSubstate = 0;
unsigned long ModeSubstateMillis = 0;

//End Of Ball Bonus
unsigned long TotalEndOfBallBonus = 0;
unsigned long TotalMilesOfTrack = 0;

//Supply Tower
unsigned long SupplyTowerBonusPoints = 0;

//Track Frenzy Mode
unsigned long TrackFrenzyMillis = 0;
byte TrackFrenzyState = 0;
byte TrackFrenzyHappenedYet = 0;

//Pop bumper miles progress message
unsigned long RailroadTrackGoal = 0;

//INDIANS Multiball messages
unsigned long INDIANSModeMillis = 0;
byte INDIANSModeHappenedYet = 0;
byte INDIANSModeFlashState = 0;

//High Scores
byte HighScoreHappenedYet = 0;
byte AmpersandSkippedYet = 0;

byte HighScoreFlashState = 0;
unsigned long HighScoreFlashMillis = 0;

//////////////////////////////////////
//                                  //
//       High Score Variables       //
//                                  //
//////////////////////////////////////

//High Scores
//1-5 are initials. 6-15 are the actual score. //Numbers stored within represent default high scores.
//Top row is top score. Bottom row is bottom score.

//High Score Array
byte HighScoreArray[9][15] = {
  {95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //High Score 1
  {95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //High Score 2
  {95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //High Score 3
  {95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //High Score 4
  {95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //High Score 5
  {95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //High Score 6
  {95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //High Score 7
  {95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //High Score 8
  {95, 95, 95, 95, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, //High Score 9
};

unsigned long AssembledHighScores[9];

byte highscorerank = 0;

/////////////////////////////////////
//                                 //
//         Pin Declarations        //
//                                 //
/////////////////////////////////////

byte azero = 22;
byte aone = 24;
byte atwo = 26;
byte athree = 28;
byte afour = 30;
byte afive = 32;
byte asix = 34;
byte aseven = 36;
byte aeight = 38;
byte anine = 40;
byte aten = 42;
byte aeleven = 44;

byte qzero = 46;
byte qone = 48;
byte qtwo = 50;
byte qthree = 52;

byte chipenable = 47;
byte writeenable = 49;
byte whichbuffer = 51;

/////////////////////////////////////
//                                 //
//     Communication Variables     //
//                                 //
/////////////////////////////////////

byte DataReceived[21];
byte LastDataReceived[21];
//Each byte of data, in order:
//0. Unique number
//1. Game Active
//2. Billions (Score)
//3. Hundred Millions
//4. Ten Millions
//5. Millions
//6. Hundred Thousands
//7. Ten Thousands
//8. Thousands
//9. Hundreds
//10. Tens
//11. Ones
//12. Credit Tens
//13. Credit Ones
//14. Ball Number
//15. Current Mode
//16. Stage of mode
//17. Mode Variable One
//18. Mode Variable Two
//19. Mode Variable Three
//20. Mode Variable Four

//All of the old variables.

//byte mode = 0;
//byte lastmode = 0;

//byte creditones = 0;
//byte credittens = 0;

//byte currentball = 0;
//byte lastball = 0;

byte lastdigits = 0;
byte currentdigits = 2; //For the score of 00 at the beginning.

//byte mpvariable = 0;
//byte lastmpvariable = 0;
//byte mpvariabletwo = 0;
//byte lastmpvariabletwo = 0;
byte mpvariablethree = 0;
byte lastmpvariablethree = 0;

//byte bytenum = 0;
byte newdata = 0;

//byte image = 0;

//byte uniquenumber = 0;

void setup() {
    // put your setup code here, to run once:

    pinMode(azero, OUTPUT);
    pinMode(aone, OUTPUT);
    pinMode(atwo, OUTPUT);
    pinMode(athree, OUTPUT);
    pinMode(afour, OUTPUT);
    pinMode(afive, OUTPUT);
    pinMode(asix, OUTPUT);
    pinMode(aseven, OUTPUT);
    pinMode(aeight, OUTPUT);
    pinMode(anine, OUTPUT);
    pinMode(aten, OUTPUT);
    pinMode(aeleven, OUTPUT);

    pinMode(qzero, OUTPUT);
    pinMode(qone, OUTPUT);
    pinMode(qtwo, OUTPUT);
    pinMode(qthree, OUTPUT);

    pinMode(chipenable, OUTPUT);
    pinMode(writeenable, OUTPUT);
    pinMode(whichbuffer, OUTPUT);

    //Turn pins on and off to prepare for data.
    digitalWrite(azero, LOW);
    digitalWrite(aone, LOW);
    digitalWrite(atwo, LOW);
    digitalWrite(athree, LOW);
    digitalWrite(afour, LOW);
    digitalWrite(afive, LOW);
    digitalWrite(asix, LOW);
    digitalWrite(aseven, LOW);
    digitalWrite(aeight, LOW);
    digitalWrite(anine, LOW);
    digitalWrite(aten, LOW);
    digitalWrite(aeleven, LOW);

    digitalWrite(qzero, LOW);
    digitalWrite(qone, LOW);
    digitalWrite(qtwo, LOW);
    digitalWrite(qthree, LOW);

    digitalWrite(chipenable, LOW);
    digitalWrite(writeenable, HIGH);
    digitalWrite(whichbuffer, LOW);
    /*
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x] = 0;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+8] = 1;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+16] = 2;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+24] = 3;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+32] = 4;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+40] = 5;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+48] = 6;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+56] = 7;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+64] = 0;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+72] = 1;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+80] = 2;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+88] = 3;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+96] = 4;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+104] = 5;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+112] = 6;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 32; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+120] = 7;
            }
          x = 0;
        }
      y = 0;
      /*
      for(y = 0; y < 8; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+120] = 0;
            }
          x = 0;
        }
      y = 0;
      for(y = 0; y < 8; y++)
        {
          for(x = 0; x < 8; x++)
            {
              masterbuffer[y][x+112] = 1;
            }
          x = 0;
        }
      y = 0;
      */
    DrawToBufferWhatShouldBeDrawnToBuffer(); //Clears whatever the RAM booted with
    WriteToDisplay();

    //Serial Monitor
    Serial.begin(115200);
    Serial.println(F("Program started."));

    //Hardware serial Communication between boards
    Serial2.begin(115200);

    randomSeed(analogRead(0));
}

void loop() {
    // put your main code here, to run repeatedly:
    CurrentProgramMillis = millis();
    CheckAndReadSerial();
    DrawToBufferWhatShouldBeDrawnToBuffer();
    WriteToDisplay();
    //delay(1000);
}

void WriteToDisplay()
{
    for (byte y = 0; y < 32; y++)
    {
        for (byte x = 0; x < 128; x++)
        {
            if (masterbuffer[y][x] != LastMasterBuffer[y][x])
            {
                NewBufferData = 1;
            }
            LastMasterBuffer[y][x] = masterbuffer[y][x];
        }
    }
    
    if (NewBufferData == 0)
    {
        return; //No point tying up the program with 1000s of digitalwrites
    }

    for (byte y = 0; y < 32; y++)
    {
        //write binary number to vertical address pins
        mathy = y;
        if (mathy >= 16)
        {
            mathy -= 16;
            digitalWrite(aeleven, HIGH);
        }
        else
        {
            digitalWrite(aeleven, LOW);
        }

        if (mathy >= 8)
        {
            mathy -= 8;
            digitalWrite(aten, HIGH);
        }
        else
        {
            digitalWrite(aten, LOW);
        }

        if (mathy >= 4)
        {
            mathy -= 4;
            digitalWrite(anine, HIGH);
        }
        else
        {
            digitalWrite(anine, LOW);
        }

        if (mathy >= 2)
        {
            mathy -= 2;
            digitalWrite(aeight, HIGH);
        }
        else
        {
            digitalWrite(aeight, LOW);
        }

        if (mathy >= 1)
        {
            mathy -= 1;
            digitalWrite(aseven, HIGH);
        }
        else
        {
            digitalWrite(aseven, LOW);
        }

        for (byte x = 0; x < 128; x++)
        {
            mathx = x;
            if (mathx >= 64)
            {
                mathx -= 64;
                digitalWrite(asix, HIGH);
            }
            else
            {
                digitalWrite(asix, LOW);
            }

            if (mathx >= 32)
            {
                mathx -= 32;
                digitalWrite(afive, HIGH);
            }
            else
            {
                digitalWrite(afive, LOW);
            }

            if (mathx >= 16)
            {
                mathx -= 16;
                digitalWrite(afour, HIGH);
            }
            else
            {
                digitalWrite(afour, LOW);
            }

            if (mathx >= 8)
            {
                mathx -= 8;
                digitalWrite(athree, HIGH);
            }
            else
            {
                digitalWrite(athree, LOW);
            }

            if (mathx >= 4)
            {
                mathx -= 4;
                digitalWrite(atwo, HIGH);
            }
            else
            {
                digitalWrite(atwo, LOW);
            }

            if (mathx >= 2)
            {
                mathx -= 2;
                digitalWrite(aone, HIGH);
            }
            else
            {
                digitalWrite(aone, LOW);
            }

            if (mathx >= 1)
            {
                mathx -= 1;
                digitalWrite(azero, HIGH);
            }
            else
            {
                digitalWrite(azero, LOW);
            }
            //write binary number to horizontal address pins.
            switch (masterbuffer[y][x])
            {
            case 7:
                digitalWrite(qzero, HIGH); //Brightest
                digitalWrite(qone, HIGH);
                digitalWrite(qtwo, HIGH);
                break;
            case 6:
                digitalWrite(qzero, HIGH); //Brightest
                digitalWrite(qone, HIGH);
                digitalWrite(qtwo, LOW);
                break;
            case 5:
                digitalWrite(qzero, HIGH); //Brightest
                digitalWrite(qone, LOW);
                digitalWrite(qtwo, HIGH);
                break;
            case 4:
                digitalWrite(qzero, HIGH); //Brightest
                digitalWrite(qone, LOW);
                digitalWrite(qtwo, LOW);
                break;
            case 3:
                digitalWrite(qzero, LOW); //Brightest
                digitalWrite(qone, HIGH);
                digitalWrite(qtwo, HIGH);
                break;
            case 2:
                digitalWrite(qzero, LOW); //Brightest
                digitalWrite(qone, HIGH);
                digitalWrite(qtwo, LOW);
                break;
            case 1:
                digitalWrite(qzero, LOW); //Brightest
                digitalWrite(qone, LOW);
                digitalWrite(qtwo, HIGH);
                break;
            case 0:
                digitalWrite(qzero, LOW); //Brightest
                digitalWrite(qone, LOW);
                digitalWrite(qtwo, LOW);
                break;
            default:
                digitalWrite(qzero, LOW); //Brightest
                digitalWrite(qone, LOW);
                digitalWrite(qtwo, LOW);
                break;
            }
            digitalWrite(chipenable, LOW);
            digitalWrite(writeenable, LOW); //We can do this because each digitalWrite takes 2 microseconds, which is 2000 nanoseconds.
            digitalWrite(chipenable, HIGH);
            digitalWrite(writeenable, HIGH);
        }
    }

    if (whichbuffervar == 0)
    {
        whichbuffervar = 1;
        digitalWrite(whichbuffer, HIGH);
    }
    else if (whichbuffervar == 1)
    {
        whichbuffervar = 0;
        digitalWrite(whichbuffer, LOW);
    }

    NewBufferData = 0;
}


////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//                   LARGE Font                       //
//                  (10px X 16px)                     //
//                                                    //
////////////////////////////////////////////////////////

byte largetemplate[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};


byte largespace[16][10];

byte largeexclamationmark[16][2] = {
    {1, 1},
    {1, 1},
    {1, 1},
    {1, 1},
    {1, 1},
    {1, 1},
    {1, 1},
    {1, 1},
    {1, 1},
    {1, 1},
    {1, 1},
    {1, 1},
    {0, 0},
    {0, 0},
    {1, 1},
    {1, 1}
};

byte largedoublequote[16][6] = {
  {1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1},
  {0, 1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0}
};

byte largehashtag[16][10] = {
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0}
};

byte largedollarsign[16][10] = {
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 0, 1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 1, 1, 0, 0, 0, 0},
  {1, 1, 1, 0, 1, 1, 0, 0, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 1, 0},
  {0, 0, 0, 0, 1, 1, 0, 1, 1, 1},
  {0, 0, 0, 0, 1, 1, 0, 0, 1, 1},
  {0, 0, 0, 0, 1, 1, 0, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0}
};

byte largepercentsign[16][10] = {
  {0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {1, 0, 0, 0, 1, 0, 0, 0, 0, 0},
  {1, 0, 0, 0, 1, 0, 0, 0, 1, 1},
  {1, 0, 0, 0, 1, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 1, 0, 0, 0, 1},
  {1, 1, 0, 0, 0, 1, 0, 0, 0, 1},
  {0, 0, 0, 0, 0, 1, 0, 0, 0, 1},
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 0}
};

byte largeampersand[16][10] = {
  {0, 0, 1, 1, 1, 1, 0, 0, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 0, 0, 0},
  {1, 1, 1, 0, 0, 1, 1, 1, 0, 0},
  {1, 1, 0, 0, 0, 0, 1, 1, 0, 0},
  {1, 1, 0, 0, 0, 0, 1, 1, 0, 0},
  {1, 1, 0, 0, 0, 1, 1, 1, 0, 0},
  {1, 1, 0, 0, 1, 1, 1, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 0, 0, 0, 0},
  {0, 1, 1, 1, 1, 0, 0, 0, 1, 1},
  {0, 1, 1, 1, 1, 0, 0, 0, 1, 1},
  {1, 1, 1, 1, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 1, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 1, 1, 1, 1, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 1, 1, 1, 1, 0, 0, 1, 1}
};

byte largesinglequote[16][2] = {
  {1, 1},
  {1, 1},
  {0, 1},
  {1, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0}
};

byte largeopeningparentheses[16][6] = {
  {0, 0, 0, 0, 1, 1},
  {0, 0, 0, 1, 1, 1},
  {0, 0, 1, 1, 1, 0},
  {0, 1, 1, 1, 1, 0},
  {0, 1, 1, 1, 0, 0},
  {1, 1, 1, 1, 0, 0},
  {1, 1, 1, 0, 0, 0},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0},
  {1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 0},
  {0, 0, 0, 1, 1, 1},
  {0, 0, 0, 0, 1, 1}
};

byte largeclosingparentheses[16][6] = {
  {1, 1, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0},
  {0, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 1},
  {0, 0, 0, 1, 1, 1},
  {0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 1, 1},
  {0, 0, 0, 1, 1, 1},
  {0, 0, 1, 1, 1, 1},
  {0, 0, 1, 1, 1, 0},
  {0, 1, 1, 1, 1, 0},
  {0, 1, 1, 1, 0, 0},
  {1, 1, 1, 0, 0, 0},
  {1, 1, 0, 0, 0, 0}
};

byte largeasterisk[16][7] = {
  {1, 0, 0, 1, 0, 0, 1},
  {0, 1, 0, 1, 0, 1, 0},
  {0, 0, 1, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 1},
  {0, 0, 1, 1, 1, 0, 0},
  {0, 1, 0, 1, 0, 1, 0},
  {1, 0, 0, 1, 0, 0, 1},
  {0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0}
};

byte largeplus[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};

byte largecomma[16][3] = {
    {0, 0, 0},
    {0, 0, 0},
    {0, 0, 0},
    {0, 0, 0},
    {0, 0, 0},
    {0, 0, 0},
    {0, 0, 0},
    {0, 0, 0},
    {0, 0, 0},
    {0, 0, 0},
    {0, 0, 0},
    {1, 1, 1},
    {1, 1, 1},
    {0, 0, 1},
    {0, 1, 0},
    {1, 0, 0}
};
/* WILL BE REMOVED AFTER UPDATE
void drawlargecomma(int xshift, int yshift)
{
  byte largecomma[5][3] = {
    {1, 1, 1},
    {1, 1, 1},
    {0, 0, 1},
    {0, 1, 0},
    {1, 0, 0}
  };
  for (y = 0; y < 5; y++)
  {
    for (x = 0; x < 3; x++)
    {
      masterbuffer[y + yshift][x + xshift] = largecomma[y][x];
    }
    x = 0;
  }
  y = 0;
}
*/
byte largehyphen[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};

byte largeperiod[16][4] = {
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 1, 1, 0},
  {1, 1, 1, 1},
  {1, 1, 1, 1},
  {0, 1, 1, 0}
};

byte largeslash[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0}
};

byte largezero[16][10] = {
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 1, 1, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 1, 1, 0, 0, 0, 1, 1},
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0}
};

byte largeone[16][10] = {
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0}
};

byte largetwo[16][10] = {
  {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 0, 0, 0, 1, 1, 1, 0},
  {1, 1, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 0, 0, 0, 0, 0, 0, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};

byte largethree[16][10] = {
  {0, 1, 1, 1, 1, 1, 1, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {1, 0, 0, 0, 0, 0, 0, 1, 1, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 0, 0, 0, 0, 0, 0, 1, 1, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 0, 0, 0}
};

byte largefour[16][10] = {
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 1, 1, 0, 1, 1, 0, 0},
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
  {0, 1, 1, 0, 0, 0, 1, 1, 0, 0},
  {1, 1, 0, 0, 0, 0, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0}
};

byte largefive[16][10] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 0, 0, 0, 0, 0, 0, 1, 1, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 0, 0, 0}
};

byte largesix[16][10] = {
  {0, 0, 0, 0, 1, 1, 1, 1, 1, 1},
  {0, 0, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {0, 1, 1, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 1, 1, 1, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 1, 1, 0, 0, 0, 0, 1, 1, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {0, 0, 0, 1, 1, 1, 1, 0, 0, 0}
};

byte largeseven[16][10] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0}
};

byte largeeight[16][10] = {
  {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 1, 1, 1, 1, 0, 0, 0}
};

byte largenine[16][10] = {
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {0, 1, 1, 0, 0, 0, 0, 1, 1, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 1},
  {0, 0, 0, 1, 1, 1, 1, 0, 1, 1},
  {0, 0, 0, 0, 1, 1, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 1, 1, 0},
  {0, 1, 0, 0, 0, 0, 1, 1, 1, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 0, 0, 0}
};

byte largecolon[16][4] = {
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 1, 1, 0},
  {1, 1, 1, 1},
  {1, 1, 1, 1},
  {0, 1, 1, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 1, 1, 0},
  {1, 1, 1, 1},
  {1, 1, 1, 1},
  {0, 1, 1, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
};

byte largesemicolon[16][4] = {
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 1, 1, 0},
  {1, 1, 1, 1},
  {1, 1, 1, 1},
  {0, 1, 1, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 1, 1, 0},
  {0, 1, 1, 0},
  {0, 0, 1, 0},
  {0, 1, 0, 0},
};

byte largelessthan[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 1},
  {0, 0, 0, 0, 1, 1, 1, 1, 0, 0},
  {0, 0, 1, 1, 1, 1, 0, 0, 0, 0},
  {1, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};

byte largeequals[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};

byte largegreaterthan[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 1},
  {0, 0, 0, 0, 1, 1, 1, 1, 0, 0},
  {0, 0, 1, 1, 1, 1, 0, 0, 0, 0},
  {1, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};

byte largequestionmark[16][10] = {
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {0, 1, 1, 0, 0, 0, 0, 1, 1, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0}
};

byte largeatsymbol[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 1, 0, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 0, 1, 0, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};

byte largeuppercasea[16][10] = {
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1}
};

byte largeuppercaseb[16][10] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0}
};

byte largeuppercasec[16][10] = {
  {0, 0, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 1, 1, 1, 1, 1, 1, 1, 1}
};

byte largeuppercased[16][10] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0}
};

byte largeuppercasee[16][10] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};

byte largeuppercasef[16][10] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0}
};

byte largeuppercaseg[16][10] = {
  {0, 0, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 1, 1, 1, 1, 1, 1},
  {1, 1, 0, 0, 1, 1, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0}
};

byte largeuppercaseh[16][10] = {
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1}
};

byte largeuppercasei[16][10] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};

byte largeuppercasej[16][10] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {1, 1, 0, 0, 0, 0, 1, 1, 0, 0},
  {1, 1, 1, 0, 0, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 0, 0, 0, 0}
};

byte largeuppercasek[16][10] = {
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1, 1, 0},
  {1, 1, 0, 0, 0, 1, 1, 1, 0, 0},
  {1, 1, 0, 0, 1, 1, 1, 0, 0, 0},
  {1, 1, 0, 1, 1, 1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
  {1, 1, 0, 1, 1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 1, 1, 1, 0, 0, 0},
  {1, 1, 0, 0, 0, 1, 1, 1, 0, 0},
  {1, 1, 0, 0, 0, 0, 1, 1, 1, 0},
  {1, 1, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1}
};

byte largeuppercasel[16][10] = {
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};

byte largeuppercasem[16][10] = {
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 1, 1, 0, 0, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 0, 1, 1, 1, 1, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1}
};

byte largeuppercasen[16][10] = {
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 1, 1, 0, 0, 0, 1, 1},
  {1, 1, 0, 1, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 1, 0, 1, 1},
  {1, 1, 0, 0, 0, 1, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1}
};

byte largeuppercaseo[16][10] = {
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0}
};

byte largeuppercasep[16][10] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0}
};

byte largeuppercaseq[16][10] = {
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 1, 0, 1, 1},
  {1, 1, 0, 0, 0, 1, 1, 1, 1, 1},
  {1, 1, 1, 0, 0, 0, 1, 1, 1, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 1, 1, 1, 1, 1, 0, 1, 1}
};

byte largeuppercaser[16][10] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {1, 1, 0, 1, 1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 1, 1, 1, 0, 0, 0},
  {1, 1, 0, 0, 0, 1, 1, 1, 0, 0},
  {1, 1, 0, 0, 0, 0, 1, 1, 1, 0},
  {1, 1, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1}
};

byte largeuppercases[16][10] = {
  {0, 0, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0}
};

byte largeuppercaset[16][10] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0}
};

byte largeuppercaseu[16][10] = {
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0}
};

byte largeuppercasev[16][10] = {
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0}
};

byte largeuppercasew[16][10] = {
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 1, 1, 1, 1, 0, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 0, 0, 1, 1, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1}
};

byte largeuppercasex[16][10] = {
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {0, 1, 1, 0, 0, 0, 0, 1, 1, 0},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {0, 1, 1, 0, 0, 0, 0, 1, 1, 0},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1}
};

byte largeuppercasey[16][10] = {
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0}
};

byte largeuppercasez[16][10] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};

byte largeopeningbracket[16][6] = {
  {1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1}
};

byte largebackslash[16][10] = {
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 1, 1}
};

byte largeclosingbracket[16][6] = {
  {1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1},
  {0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 1, 1},
  {1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1}
};

byte largecarat[16][10] = {
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};

byte largeunderscore[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};

byte largegraveaccent[16][4] = {
  {1, 1, 0, 0},
  {1, 1, 1, 0},
  {0, 1, 1, 1},
  {0, 0, 1, 1},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0}
};

byte largelowercasea[16][9] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 0, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 0, 0, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 1, 1, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 1, 1, 1, 1, 0, 1, 1}
};

byte largelowercaseb[16][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 1, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 1, 0, 1, 1, 1},
  {1, 1, 1, 0, 0, 0, 1, 1},
  {1, 1, 1, 1, 0, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 0, 1, 1, 1, 0, 0}
};

byte largelowercasec[16][6] = {
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1},
  {0, 1, 1, 1, 1, 1},
  {1, 1, 1, 0, 0, 0},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0},
  {0, 1, 1, 1, 1, 1},
  {0, 0, 1, 1, 1, 1}
};

byte largelowercased[16][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 1, 1, 1, 0, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 0, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 1, 1, 1},
  {1, 1, 1, 0, 1, 1, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 1, 1, 1, 0, 1, 1}
};

byte largelowercasee[16][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 1, 1, 1, 1, 1, 1}
};

byte largelowercasef[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 1, 1, 1, 1},
  {0, 0, 0, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 0, 0, 0, 0, 0, 0}
};

byte largelowercaseg[16][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 1, 1, 1, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 0},
  {0, 1, 1, 1, 1, 1, 0, 0}
};

byte largelowercaseh[16][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1}
};

byte largelowercasei[16][2] = {
  {0, 0},
  {0, 0},
  {1, 1},
  {1, 1},
  {0, 0},
  {0, 0},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1}
};

byte largelowercasej[16][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0},
  {1, 1, 0, 0, 1, 1, 0, 0},
  {1, 1, 0, 0, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 0, 0, 0}
};

byte largelowercasek[16][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 1, 1, 1, 0},
  {1, 1, 0, 1, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 0, 0, 0},
  {1, 1, 1, 1, 1, 0, 0, 0},
  {1, 1, 0, 1, 1, 1, 0, 0},
  {1, 1, 0, 0, 1, 1, 1, 0},
  {1, 1, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1}
};

byte largelowercasel[16][2] = {
  {0, 0},
  {0, 0},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1}
};

byte largelowercasem[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 0, 0, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1}
};

byte largelowercasen[16][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1}
};

byte largelowercaseo[16][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 1, 0, 0}
};

byte largelowercasep[16][7] = {
  {0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 0, 0},
  {1, 1, 1, 1, 1, 1, 0},
  {1, 1, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 1, 1, 0, 0},
  {1, 1, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0}
};

byte largelowercaseq[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 0, 0, 0},
  {1, 1, 1, 0, 0, 1, 1, 0, 0, 0},
  {1, 1, 0, 0, 0, 1, 1, 0, 0, 0},
  {1, 1, 1, 0, 0, 1, 1, 0, 0, 0},
  {0, 1, 1, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
  {0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
  {0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
  {0, 0, 0, 0, 0, 1, 1, 0, 1, 1},
  {0, 0, 0, 0, 0, 1, 1, 0, 1, 1},
  {0, 0, 0, 0, 0, 1, 1, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 0}
};

byte largelowercaser[16][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 1, 1, 1, 1},
  {1, 1, 0, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 0, 0, 0},
  {1, 1, 1, 1, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0}
};

byte largelowercases[16][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0, 1},
  {0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 0},
  {1, 1, 1, 1, 1, 1, 0, 0}
};

byte largelowercaset[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0}
};

byte largelowercaseu[16][8] = {
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 1, 1, 1, 0, 1, 1}
};

byte largelowercasev[16][9] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 1, 1},
  {0, 1, 1, 0, 0, 0, 1, 1, 0},
  {0, 1, 1, 0, 0, 0, 1, 1, 0},
  {0, 1, 1, 0, 0, 0, 1, 1, 0},
  {0, 1, 1, 1, 0, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 0, 1, 0, 0, 0, 0}
};

byte largelowercasew[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 1, 1, 1, 1, 0, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0}
};

byte largelowercasex[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1}
};

byte largelowercasey[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 0, 0, 0, 0, 1, 1, 1},
  {0, 1, 1, 1, 0, 0, 1, 1, 1, 0},
  {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
  {0, 0, 0, 1, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0, 0, 0, 0}
};

byte largelowercasez[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 1, 1, 1, 0, 0},
  {0, 0, 0, 0, 1, 1, 1, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};

byte largeopeningcurlybrace[16][7] = {
  {0, 0, 0, 0, 1, 1, 1},
  {0, 0, 0, 1, 1, 1, 1},
  {0, 0, 1, 1, 1, 0, 0},
  {0, 0, 1, 1, 0, 0, 0},
  {0, 0, 1, 1, 0, 0, 0},
  {0, 1, 1, 1, 0, 0, 0},
  {0, 1, 1, 0, 0, 0, 0},
  {1, 1, 0, 0, 0, 0, 0},
  {0, 1, 1, 0, 0, 0, 0},
  {0, 1, 1, 1, 0, 0, 0},
  {0, 0, 1, 1, 0, 0, 0},
  {0, 0, 1, 1, 0, 0, 0},
  {0, 0, 1, 1, 0, 0, 0},
  {0, 0, 1, 1, 1, 0, 0},
  {0, 0, 0, 1, 1, 1, 1},
  {0, 0, 0, 0, 1, 1, 1}
};

byte largeverticalpipe[16][2] = {
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1},
  {1, 1}
};

byte largeclosingcurlybrace[16][7] = {
  {1, 1, 1, 0, 0, 0, 0},
  {1, 1, 1, 1, 0, 0, 0},
  {0, 0, 1, 1, 1, 0, 0},
  {0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 1, 1, 1, 0},
  {0, 0, 0, 0, 1, 1, 0},
  {0, 0, 0, 0, 0, 1, 1},
  {0, 0, 0, 0, 1, 1, 0},
  {0, 0, 0, 1, 1, 1, 0},
  {0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 1, 1, 0, 0},
  {0, 0, 1, 1, 1, 0, 0},
  {1, 1, 1, 1, 0, 0, 0},
  {1, 1, 1, 0, 0, 0, 0}
};

byte largetilde[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 0, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 1, 0, 0, 0, 0, 0},
  {1, 1, 0, 1, 1, 1, 0, 0, 1, 1},
  {1, 1, 0, 0, 1, 1, 1, 0, 1, 1},
  {0, 0, 0, 0, 0, 1, 1, 1, 1, 0},
  {0, 0, 0, 0, 0, 0, 1, 1, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};

byte largebackspace[16][10] = {
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
  {0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {0, 1, 1, 1, 0, 0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1, 0, 0, 0, 0, 0},
  {0, 0, 0, 1, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 1, 1, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};

byte largesquare[16][10] = {
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 0, 0, 0, 0, 0, 0, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};

void cleardisplay()
{
    for (y = 0; y < 32; y++)
    {
        for (x = 0; x < 128; x++)
        {
            masterbuffer[y][x] = 0;
        }
        x = 0;
    }
    y = 0;
}

////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//                   Small Font                       //
//                  (5px X 8px)                       //
//                                                    //
////////////////////////////////////////////////////////

byte smallspace[8][5];

byte smallexclamationmark[8][1] = {
  {1},
  {1},
  {1},
  {1},
  {1},
  {1},
  {0},
  {1}
};

byte smalldoublequote[8][3] = {
  {1, 0, 1},
  {1, 0, 1},
  {0, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {0, 0, 0}
};

byte smallhashtag[8][5] = {
  {0, 1, 0, 1, 0},
  {0, 1, 0, 1, 0},
  {1, 1, 1, 1, 1},
  {0, 1, 0, 1, 0},
  {0, 1, 0, 1, 0},
  {1, 1, 1, 1, 1},
  {0, 1, 0, 1, 0},
  {0, 1, 0, 1, 0}
};

byte smalldollarsign[8][5] = {
  {0, 0, 1, 0, 0},
  {0, 1, 1, 1, 1},
  {1, 0, 1, 0, 0},
  {0, 1, 1, 1, 0},
  {0, 0, 1, 0, 1},
  {0, 0, 1, 0, 1},
  {1, 1, 1, 1, 0},
  {0, 0, 1, 0, 0}
};

byte smallpercent[8][5] = {
  {1, 1, 0, 0, 0},
  {1, 1, 0, 0, 1},
  {0, 0, 0, 1, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 1, 0, 0, 0},
  {1, 0, 0, 1, 1},
  {0, 0, 0, 1, 1}
};

byte smallampersand[8][5] = {
  {0, 1, 1, 0, 0},
  {1, 0, 0, 1, 0},
  {1, 0, 0, 1, 0},
  {1, 0, 1, 0, 0},
  {0, 1, 0, 0, 1},
  {1, 0, 1, 0, 1},
  {1, 0, 0, 1, 0},
  {0, 1, 1, 0, 1}
};

byte smallsinglequote[8][1] = {
  {1},
  {1},
  {0},
  {0},
  {0},
  {0},
  {0},
  {0}
};

byte smallopeningparentheses[8][3] = {
  {0, 0, 1},
  {0, 1, 0},
  {0, 1, 0},
  {1, 0, 0},
  {1, 0, 0},
  {0, 1, 0},
  {0, 1, 0},
  {0, 0, 1}
};

byte smallclosingparentheses[8][5] = {
  {1, 0, 0},
  {0, 1, 0},
  {0, 1, 0},
  {0, 0, 1},
  {0, 0, 1},
  {0, 1, 0},
  {0, 1, 0},
  {1, 0, 0}
};

byte smallasterisk[8][5] = {
  {1, 0, 1, 0, 1},
  {0, 1, 1, 1, 0},
  {1, 1, 1, 1, 1},
  {0, 1, 1, 1, 0},
  {1, 0, 1, 0, 1},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0}
};

byte smallplus[8][5] = {
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {1, 1, 1, 1, 1},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0}
};

byte smallcomma[8][2] = {
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 1},
  {0, 1},
  {1, 0}
};

byte smallhyphen[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0}
};

byte smallperiod[8][2] = {
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {1, 1},
  {1, 1}
};

byte smallslash[8][5] = {
  {0, 0, 0, 0, 1},
  {0, 0, 0, 1, 0},
  {0, 0, 0, 1, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 1, 0, 0, 0},
  {0, 1, 0, 0, 0},
  {1, 0, 0, 0, 0}
};

byte smallzero[8][5] = {
  {0, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 1, 1},
  {1, 0, 1, 0, 1},
  {1, 0, 1, 0, 1},
  {1, 1, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {0, 1, 1, 1, 0}
};

byte smallone[8][5] = {
  {0, 0, 1, 0, 0},
  {0, 1, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 1, 1, 1, 0}
};

byte smalltwo[8][5] = {
  {0, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {0, 0, 0, 0, 1},
  {0, 0, 0, 1, 0},
  {0, 0, 1, 0, 0},
  {0, 1, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1}
};

byte smallthree[8][5] = {
  {0, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {0, 0, 0, 0, 1},
  {0, 1, 1, 1, 0},
  {0, 0, 0, 0, 1},
  {0, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {0, 1, 1, 1, 0}
};

byte smallfour[8][5] = {
  {0, 0, 1, 1, 0},
  {0, 1, 0, 1, 0},
  {1, 0, 0, 1, 0},
  {1, 1, 1, 1, 1},
  {0, 0, 0, 1, 0},
  {0, 0, 0, 1, 0},
  {0, 0, 0, 1, 0},
  {0, 0, 0, 1, 0}
};

byte smallfive[8][5] = {
  {1, 1, 1, 1, 1},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {0, 1, 1, 1, 0},
  {0, 0, 0, 0, 1},
  {0, 0, 0, 0, 1},
  {1, 1, 1, 1, 0}
};

byte smallsix[8][5] = {
  {0, 0, 1, 1, 1},
  {0, 1, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {0, 1, 1, 1, 0}
};

byte smallseven[8][5] = {
  {1, 1, 1, 1, 1},
  {0, 0, 0, 0, 1},
  {0, 0, 0, 1, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0}
};

byte smalleight[8][5] = {
  {0, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {0, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {0, 1, 1, 1, 0}
};

byte smallnine[8][5] = {
  {0, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 1, 1},
  {0, 1, 1, 0, 1},
  {0, 0, 0, 0, 1},
  {1, 0, 0, 1, 0},
  {0, 1, 1, 0, 0}
};

byte smallcolon[8][2] = {
  {0, 0},
  {1, 1},
  {1, 1},
  {0, 0},
  {0, 0},
  {1, 1},
  {1, 1},
  {0, 0}
};

byte smallsemicolon[8][2] = {
  {0, 0},
  {1, 1},
  {1, 1},
  {0, 0},
  {0, 0},
  {0, 1},
  {0, 1},
  {1, 0}
};

byte smalllessthan[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 0, 1, 1},
  {0, 1, 1, 0, 0},
  {1, 0, 0, 0, 0},
  {0, 1, 1, 0, 0},
  {0, 0, 0, 1, 1},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0}
};

byte smallequals[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0}
};

byte smallgreaterthan[8][5] = {
  {0, 0, 0, 0, 0},
  {1, 1, 0, 0, 0},
  {0, 0, 1, 1, 0},
  {0, 0, 0, 0, 1},
  {0, 0, 1, 1, 0},
  {1, 1, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0}
};

byte smallquestionmark[8][5] = {
  {0, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {0, 0, 0, 1, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 1, 0, 0}
};

byte smallatsymbol[8][7] = {
  {0, 0, 1, 1, 1, 0, 0},
  {0, 1, 0, 0, 0, 1, 0},
  {1, 0, 1, 1, 1, 0, 1},
  {1, 0, 1, 0, 1, 0, 1},
  {1, 0, 1, 1, 1, 0, 1},
  {1, 0, 0, 0, 1, 0, 1},
  {0, 1, 0, 0, 0, 1, 0},
  {0, 0, 1, 1, 1, 0, 0}
};

byte smalluppercasea[8][5] = {
  {0, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 1, 1, 1, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1}
};

byte smalluppercaseb[8][5] = {
  {1, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 1, 1, 1, 0}
};

byte smalluppercasec[8][5] = {
  {0, 1, 1, 1, 1},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {0, 1, 1, 1, 1}
};

byte smalluppercased[8][5] = {
  {1, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 1, 1, 1, 0}
};

byte smalluppercasee[8][5] = {
  {1, 1, 1, 1, 1},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1}
};

byte smalluppercasef[8][5] = {
  {1, 1, 1, 1, 1},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0}
};

byte smalluppercaseg[8][5] = {
  {0, 1, 1, 1, 1},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 1, 1, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {0, 1, 1, 1, 0}
};

byte smalluppercaseh[8][5] = {
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 1, 1, 1, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1}
};

byte smalluppercasei[8][5] = {
  {1, 1, 1, 1, 1},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {1, 1, 1, 1, 1}
};

byte smalluppercasej[8][5] = {
  {1, 1, 1, 1, 1},
  {0, 0, 0, 1, 0},
  {0, 0, 0, 1, 0},
  {0, 0, 0, 1, 0},
  {0, 0, 0, 1, 0},
  {0, 0, 0, 1, 0},
  {1, 0, 0, 1, 0},
  {0, 1, 1, 0, 0}
};

byte smalluppercasek[8][5] = {
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 1, 0},
  {1, 1, 1, 0, 0},
  {1, 0, 0, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1}
};

byte smalluppercasel[8][5] = {
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1}
};

byte smalluppercasem[8][5] = {
  {1, 0, 0, 0, 1},
  {1, 1, 0, 1, 1},
  {1, 0, 1, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1}
};

byte smalluppercasen[8][5] = {
  {1, 0, 0, 0, 1},
  {1, 1, 0, 0, 1},
  {1, 1, 0, 0, 1},
  {1, 0, 1, 0, 1},
  {1, 0, 1, 0, 1},
  {1, 0, 0, 1, 1},
  {1, 0, 0, 1, 1},
  {1, 0, 0, 0, 1}
};

byte smalluppercaseo[8][5] = {
  {0, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {0, 1, 1, 1, 0}
};

byte smalluppercasep[8][5] = {
  {1, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 1, 1, 1, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0}
};

byte smalluppercaseq[8][5] = {
  {0, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 1, 0, 1},
  {1, 0, 0, 1, 0},
  {0, 1, 1, 0, 1}
};

byte smalluppercaser[8][5] = {
  {1, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 1, 1, 1, 0},
  {1, 0, 1, 0, 0},
  {1, 0, 0, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1}
};

byte smalluppercases[8][5] = {
  {0, 1, 1, 1, 1},
  {1, 0, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {0, 1, 1, 1, 0},
  {0, 0, 0, 0, 1},
  {0, 0, 0, 0, 1},
  {0, 0, 0, 0, 1},
  {1, 1, 1, 1, 0}
};

byte smalluppercaset[8][5] = {
  {1, 1, 1, 1, 1},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0}
};

byte smalluppercaseu[8][5] = {
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {0, 1, 1, 1, 0}
};

byte smalluppercasev[8][5] = {
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {0, 1, 0, 1, 0},
  {0, 1, 0, 1, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0}
};

byte smalluppercasew[8][5] = {
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 1, 0, 1},
  {1, 1, 0, 1, 1},
  {1, 0, 0, 0, 1}
};

byte smalluppercasex[8][5] = {
  {1, 0, 0, 0, 1},
  {0, 1, 0, 1, 0},
  {0, 1, 0, 1, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 1, 0, 1, 0},
  {0, 1, 0, 1, 0},
  {1, 0, 0, 0, 1}
};

byte smalluppercasey[8][5] = {
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {0, 1, 0, 1, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0}
};

byte smalluppercasez[8][5] = {
  {1, 1, 1, 1, 1},
  {0, 0, 0, 0, 1},
  {0, 0, 0, 1, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 1, 0, 0, 0},
  {1, 0, 0, 0, 0},
  {1, 1, 1, 1, 1}
};

byte smallopeningbracket[8][3] = {
  {1, 1, 1},
  {1, 0, 0},
  {1, 0, 0},
  {1, 0, 0},
  {1, 0, 0},
  {1, 0, 0},
  {1, 0, 0},
  {1, 1, 1}
};

byte smallbackslash[8][5] = {
  {1, 0, 0, 0, 0},
  {0, 1, 0, 0, 0},
  {0, 1, 0, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 0, 1, 0},
  {0, 0, 0, 1, 0},
  {0, 0, 0, 0, 1}
};

byte smallclosingbracket[8][3] = {
  {1, 1, 1},
  {0, 0, 1},
  {0, 0, 1},
  {0, 0, 1},
  {0, 0, 1},
  {0, 0, 1},
  {0, 0, 1},
  {1, 1, 1}
};

byte smallcarat[8][5] = {
  {0, 0, 1, 0, 0},
  {0, 1, 0, 1, 0},
  {1, 0, 0, 0, 1},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0}
};

byte smallunderscore[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1}
};

byte smallgraveaccent[8][2] = {
  {1, 0},
  {0, 1},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0},
  {0, 0}
};

byte smalllowercasea[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 1, 1, 0, 0},
  {1, 0, 0, 1, 0},
  {1, 0, 0, 1, 0},
  {0, 1, 1, 0, 1}
};

byte smalllowercaseb[8][4] = {
  {0, 0, 0, 0},
  {1, 0, 0, 0},
  {1, 0, 0, 0},
  {1, 0, 0, 0},
  {1, 1, 1, 0},
  {1, 0, 0, 1},
  {1, 0, 0, 1},
  {1, 1, 1, 0}
};

byte smalllowercasec[8][3] = {
  {0, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {0, 0, 0},
  {0, 1, 1},
  {1, 0, 0},
  {1, 0, 0},
  {0, 1, 1}
};

byte smalllowercased[8][4] = {
  {0, 0, 0, 0},
  {0, 0, 0, 1},
  {0, 0, 0, 1},
  {0, 0, 0, 1},
  {0, 1, 1, 1},
  {1, 0, 0, 1},
  {1, 0, 0, 1},
  {0, 1, 1, 1}
};

byte smalllowercasee[8][4] = {
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 1, 1, 0},
  {1, 0, 0, 1},
  {1, 1, 1, 1},
  {1, 0, 0, 0},
  {0, 1, 1, 1}
};

byte smalllowercasef[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 1, 1, 1},
  {0, 1, 0, 0, 0},
  {0, 1, 0, 0, 0},
  {1, 1, 1, 1, 0},
  {0, 1, 0, 0, 0},
  {0, 1, 0, 0, 0},
  {0, 1, 0, 0, 0}
};

byte smalllowercaseg[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 1, 1, 1, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {0, 1, 1, 1, 1},
  {0, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {0, 1, 1, 1, 0}
};

byte smalllowercaseh[8][4] = {
  {0, 0, 0, 0},
  {1, 0, 0, 0},
  {1, 0, 0, 0},
  {1, 0, 0, 0},
  {1, 1, 1, 0},
  {1, 0, 0, 1},
  {1, 0, 0, 1},
  {1, 0, 0, 1}
};

byte smalllowercasei[8][1] = {
  {0},
  {1},
  {0},
  {1},
  {1},
  {1},
  {1},
  {1}
};

byte smalllowercasej[8][4] = {
  {0, 0, 1, 0},
  {1, 1, 1, 1},
  {0, 0, 1, 0},
  {0, 0, 1, 0},
  {0, 0, 1, 0},
  {0, 0, 1, 0},
  {1, 0, 1, 0},
  {0, 1, 0, 0}
};

byte smalllowercasek[8][4] = {
  {0, 0, 0, 0},
  {1, 0, 0, 0},
  {1, 0, 0, 0},
  {1, 0, 0, 1},
  {1, 0, 1, 0},
  {1, 1, 0, 0},
  {1, 0, 1, 0},
  {1, 0, 0, 1}
};

byte smalllowercasel[8][1] = {
  {0},
  {1},
  {1},
  {1},
  {1},
  {1},
  {1},
  {1}
};

byte smalllowercasem[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 1, 0, 1, 0},
  {1, 0, 1, 0, 1},
  {1, 0, 1, 0, 1},
  {1, 0, 1, 0, 1},
  {1, 0, 1, 0, 1}
};

byte smalllowercasen[8][4] = {
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 1, 1, 0},
  {1, 0, 0, 1},
  {1, 0, 0, 1},
  {1, 0, 0, 1},
  {1, 0, 0, 1}
};

byte smalllowercaseo[8][4] = {
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 1, 1, 0},
  {1, 0, 0, 1},
  {1, 0, 0, 1},
  {0, 1, 1, 0}
};

byte smalllowercasep[8][3] = {
  {0, 0, 0},
  {0, 0, 0},
  {1, 1, 0},
  {1, 0, 1},
  {1, 1, 0},
  {1, 0, 0},
  {1, 0, 0},
  {1, 0, 0}
};

byte smalllowercaseq[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 1, 1, 0, 0},
  {1, 0, 1, 0, 0},
  {0, 1, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 1},
  {0, 0, 0, 1, 0}
};

byte smalllowercaser[8][4] = {
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {1, 0, 1, 1},
  {1, 1, 0, 0},
  {1, 0, 0, 0},
  {1, 0, 0, 0},
  {1, 0, 0, 0}
};

byte smalllowercases[8][4] = {
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 0, 0, 0},
  {0, 1, 1, 1},
  {1, 0, 0, 0},
  {0, 1, 1, 0},
  {0, 0, 0, 1},
  {1, 1, 1, 0}
};

byte smalllowercaset[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {1, 1, 1, 1, 1},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 1, 0, 0}
};

byte smalllowercaseu[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {1, 0, 0, 1, 0},
  {1, 0, 0, 1, 0},
  {1, 0, 0, 1, 0},
  {1, 0, 0, 1, 0},
  {0, 1, 1, 0, 1}
};

byte smalllowercasev[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {0, 1, 0, 1, 0},
  {0, 1, 0, 1, 0},
  {0, 0, 1, 0, 0}
};

byte smalllowercasew[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 1, 0, 1},
  {0, 1, 0, 1, 0}
};

byte smalllowercasex[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {1, 0, 0, 0, 1},
  {0, 1, 0, 1, 0},
  {0, 0, 1, 0, 0},
  {0, 1, 0, 1, 0},
  {1, 0, 0, 0, 1}
};

byte smalllowercasey[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {1, 0, 0, 0, 1},
  {0, 1, 0, 1, 0},
  {0, 0, 1, 0, 0},
  {0, 1, 0, 0, 0},
  {1, 0, 0, 0, 0}
};

byte smalllowercasez[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {1, 1, 1, 1, 1},
  {0, 0, 0, 1, 0},
  {0, 0, 1, 0, 0},
  {0, 1, 0, 0, 0},
  {1, 1, 1, 1, 1}
};

byte smallopeningcurlybrace[8][4] = {
  {0, 0, 1, 1},
  {0, 1, 0, 0},
  {0, 1, 0, 0},
  {1, 0, 0, 0},
  {0, 1, 0, 0},
  {0, 1, 0, 0},
  {0, 1, 0, 0},
  {0, 0, 1, 1}
};

byte smallverticalpipe[8][1] = {
  {1},
  {1},
  {1},
  {1},
  {1},
  {1},
  {1},
  {1}
};

byte smallclosingcurlybrace[8][4] = {
  {1, 1, 0, 0},
  {0, 0, 1, 0},
  {0, 0, 1, 0},
  {0, 0, 0, 1},
  {0, 0, 1, 0},
  {0, 0, 1, 0},
  {0, 0, 1, 0},
  {1, 1, 0, 0}
};

byte smalltilde[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 1, 0, 0, 0},
  {1, 0, 1, 0, 1},
  {0, 0, 0, 1, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0}
};

byte smallbackspace[8][5] = {
  {0, 0, 0, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 1, 0, 0, 0},
  {1, 1, 1, 1, 1},
  {0, 1, 0, 0, 0},
  {0, 0, 1, 0, 0},
  {0, 0, 0, 0, 0},
  {0, 0, 0, 0, 0}
};

byte smallsquare[8][5] = {
  {1, 1, 1, 1, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 0, 0, 0, 1},
  {1, 1, 1, 1, 1}
};

byte smallcopyright[8][8] = {
  {0, 0, 1, 1, 1, 0, 0},
  {0, 1, 0, 0, 0, 1, 0},
  {1, 0, 1, 1, 1, 0, 1},
  {1, 0, 1, 0, 0, 0, 1},
  {1, 0, 1, 0, 0, 0, 1},
  {1, 0, 1, 1, 1, 0, 1},
  {0, 1, 0, 0, 0, 1, 0},
  {0, 0, 1, 1, 1, 0, 0}
};

////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//     Character Drawing / Determining Functions      //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////

byte drawalphanumericstring(char* text, byte font, int xshift, int yshift, int shade, boolean invert, boolean replacebackground, byte justified, boolean OnlyGetLength) //justified: 0 = start drwaing from left, 1 = center around xshift, 2 = start drawing from right.
{
    byte currentcharacter = 0;
    byte currentx = 0;
    byte currentwidth = 0;
    byte totalwidth = 0;
    byte totalcharacters = 0;

    //Where I got some help for this stuff... (I read through a response to a slightly different problem.)
    //https://forum.arduino.cc/index.php?topic=435657.0
    while (*text != '\0')  //This part figures out the length of the string.
    {
        currentcharacter = *text;
        currentwidth = drawalphanumericcharacter(currentcharacter, font, xshift + currentx, yshift, shade, invert, replacebackground, 1);

        currentx += currentwidth; //Move to next character space
        currentx += 1;            //Make sure there is a space between characters!

        text++;
        totalcharacters++;
    }

    if (OnlyGetLength == 0)
    {
        totalwidth = currentx - 1; //Gets rid of the space after the last character.
        currentx = 0;
        currentwidth = 0;

        text -= totalcharacters; //Should set the mem. address back to the start.

        if (justified == 1)
        {
            xshift = xshift - (totalwidth / 2); //Should center it around whatever xshift was when it was passed into the function.
        }
        else if (justified == 2)
        {
            xshift = xshift - totalwidth;
        }

        while (*text != '\0')  //This part actually draws the string.
        {
            currentcharacter = *text;
            currentwidth = drawalphanumericcharacter(currentcharacter, font, xshift + currentx, yshift, shade, invert, replacebackground, 0);

            currentx += currentwidth; //Move to next character space
            currentx += 1;            //Make sure there is a space between characters!

            text++;
        }
    }

    return currentx;
}

byte drawalphanumericcharacter(int character, byte font, int xshift, int yshift, int shade, boolean invert, boolean replacebackground, boolean onlygetlength)
{
    //This function will return the length of whatever character is drawn so that I can implement string drawing functions later.
    //I understand that this function WILL take forever to execute. Fortunately, this program works in tandem with a DMD controller
    //board that I designed which will continue to output a picture at 200hz regardless of what the DUE is doing.


    byte charwidth = 16; //set to 16 until otherwise.
    byte charheight = 16;


    if (font == 1)
    {
        charheight = 16;
    }
    else if (font == 2)
    {
        charheight = 8;
    }

    //This will store whatever character is chosen until it is drawn. It will also be where the invert and replacebackground is applied.
    //I just made this 16px wide so it could handle any character I threw at it, even if the largest character isn't 16px.
    byte characterprerender[16][16];

    for (x = 0; x < charwidth; x++)
    {
        for (y = 0; y < charheight; y++)
        {
            if (font == 1)
            {
                switch (character) { //Oh boy!
                case 32:
                    charwidth = 10;
                    characterprerender[y][x] = largespace[y][x];
                    break;
                case 33:
                    charwidth = 2;
                    characterprerender[y][x] = largeexclamationmark[y][x];
                    break;
                case 34:
                    charwidth = 6;
                    characterprerender[y][x] = largedoublequote[y][x];
                    break;
                case 35:
                    charwidth = 10;
                    characterprerender[y][x] = largehashtag[y][x];
                    break;
                case 36:
                    charwidth = 10;
                    characterprerender[y][x] = largedollarsign[y][x];
                    break;
                case 37:
                    charwidth = 10;
                    characterprerender[y][x] = largepercentsign[y][x];
                    break;
                case 38:
                    charwidth = 10;
                    characterprerender[y][x] = largeampersand[y][x];
                    break;
                case 39:
                    charwidth = 2;
                    characterprerender[y][x] = largesinglequote[y][x];
                    break;
                case 40:
                    charwidth = 6;
                    characterprerender[y][x] = largeopeningparentheses[y][x];
                    break;
                case 41:
                    charwidth = 6;
                    characterprerender[y][x] = largeclosingparentheses[y][x];
                    break;
                case 42:
                    charwidth = 7;
                    characterprerender[y][x] = largeasterisk[y][x];
                    break;
                case 43:
                    charwidth = 10;
                    characterprerender[y][x] = largeplus[y][x];
                    break;
                case 44:
                    charwidth = 3;
                    characterprerender[y][x] = largecomma[y][x];
                    break;
                case 45:
                    charwidth = 10;
                    characterprerender[y][x] = largehyphen[y][x];
                    break;
                case 46:
                    charwidth = 4;
                    characterprerender[y][x] = largeperiod[y][x];
                    break;
                case 47:
                    charwidth = 10;
                    characterprerender[y][x] = largeslash[y][x];
                    break;
                case 48:
                    charwidth = 10;
                    characterprerender[y][x] = largezero[y][x];
                    break;
                case 49:
                    charwidth = 10;
                    characterprerender[y][x] = largeone[y][x];
                    break;
                case 50:
                    charwidth = 10;
                    characterprerender[y][x] = largetwo[y][x];
                    break;
                case 51:
                    charwidth = 10;
                    characterprerender[y][x] = largethree[y][x];
                    break;
                case 52:
                    charwidth = 10;
                    characterprerender[y][x] = largefour[y][x];
                    break;
                case 53:
                    charwidth = 10;
                    characterprerender[y][x] = largefive[y][x];
                    break;
                case 54:
                    charwidth = 10;
                    characterprerender[y][x] = largesix[y][x];
                    break;
                case 55:
                    charwidth = 10;
                    characterprerender[y][x] = largeseven[y][x];
                    break;
                case 56:
                    charwidth = 10;
                    characterprerender[y][x] = largeeight[y][x];
                    break;
                case 57:
                    charwidth = 10;
                    characterprerender[y][x] = largenine[y][x];
                    break;
                case 58:
                    charwidth = 4;
                    characterprerender[y][x] = largecolon[y][x];
                    break;
                case 59:
                    charwidth = 4;
                    characterprerender[y][x] = largesemicolon[y][x];
                    break;
                case 60:
                    charwidth = 10;
                    characterprerender[y][x] = largelessthan[y][x];
                    break;
                case 61:
                    charwidth = 10;
                    characterprerender[y][x] = largeequals[y][x];
                    break;
                case 62:
                    charwidth = 10;
                    characterprerender[y][x] = largegreaterthan[y][x];
                    break;
                case 63:
                    charwidth = 10;
                    characterprerender[y][x] = largequestionmark[y][x];
                    break;
                case 64:
                    charwidth = 10;
                    characterprerender[y][x] = largeatsymbol[y][x];
                    break;
                case 65:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasea[y][x];
                    break;
                case 66:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercaseb[y][x];
                    break;
                case 67:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasec[y][x];
                    break;
                case 68:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercased[y][x];
                    break;
                case 69:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasee[y][x];
                    break;
                case 70:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasef[y][x];
                    break;
                case 71:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercaseg[y][x];
                    break;
                case 72:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercaseh[y][x];
                    break;
                case 73:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasei[y][x];
                    break;
                case 74:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasej[y][x];
                    break;
                case 75:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasek[y][x];
                    break;
                case 76:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasel[y][x];
                    break;
                case 77:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasem[y][x];
                    break;
                case 78:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasen[y][x];
                    break;
                case 79:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercaseo[y][x];
                    break;
                case 80:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasep[y][x];
                    break;
                case 81:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercaseq[y][x];
                    break;
                case 82:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercaser[y][x];
                    break;
                case 83:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercases[y][x];
                    break;
                case 84:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercaset[y][x];
                    break;
                case 85:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercaseu[y][x];
                    break;
                case 86:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasev[y][x];
                    break;
                case 87:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasew[y][x];
                    break;
                case 88:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasex[y][x];
                    break;
                case 89:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasey[y][x];
                    break;
                case 90:
                    charwidth = 10;
                    characterprerender[y][x] = largeuppercasez[y][x];
                    break;
                case 91:
                    charwidth = 6;
                    characterprerender[y][x] = largeopeningbracket[y][x];
                    break;
                case 92:
                    charwidth = 10;
                    characterprerender[y][x] = largebackslash[y][x];
                    break;
                case 93:
                    charwidth = 6;
                    characterprerender[y][x] = largeclosingbracket[y][x];
                    break;
                case 94:
                    charwidth = 10;
                    characterprerender[y][x] = largecarat[y][x];
                    break;
                case 95:
                    charwidth = 10;
                    characterprerender[y][x] = largeunderscore[y][x];
                    break;
                case 96:
                    charwidth = 4;
                    characterprerender[y][x] = largegraveaccent[y][x];
                    break;
                case 97:
                    charwidth = 9;
                    characterprerender[y][x] = largelowercasea[y][x];
                    break;
                case 98:
                    charwidth = 8;
                    characterprerender[y][x] = largelowercaseb[y][x];
                    break;
                case 99:
                    charwidth = 6;
                    characterprerender[y][x] = largelowercasec[y][x];
                    break;
                case 100:
                    charwidth = 8;
                    characterprerender[y][x] = largelowercased[y][x];
                    break;
                case 101:
                    charwidth = 8;
                    characterprerender[y][x] = largelowercasee[y][x];
                    break;
                case 102:
                    charwidth = 10;
                    characterprerender[y][x] = largelowercasef[y][x];
                    break;
                case 103:
                    charwidth = 8;
                    characterprerender[y][x] = largelowercaseg[y][x];
                    break;
                case 104:
                    charwidth = 8;
                    characterprerender[y][x] = largelowercaseh[y][x];
                    break;
                case 105:
                    charwidth = 2;
                    characterprerender[y][x] = largelowercasei[y][x];
                    break;
                case 106:
                    charwidth = 8;
                    characterprerender[y][x] = largelowercasej[y][x];
                    break;
                case 107:
                    charwidth = 8;
                    characterprerender[y][x] = largelowercasek[y][x];
                    break;
                case 108:
                    charwidth = 2;
                    characterprerender[y][x] = largelowercasel[y][x];
                    break;
                case 109:
                    charwidth = 10;
                    characterprerender[y][x] = largelowercasem[y][x];
                    break;
                case 110:
                    charwidth = 8;
                    characterprerender[y][x] = largelowercasen[y][x];
                    break;
                case 111:
                    charwidth = 8;
                    characterprerender[y][x] = largelowercaseo[y][x];
                    break;
                case 112:
                    charwidth = 7;
                    characterprerender[y][x] = largelowercasep[y][x];
                    break;
                case 113:
                    charwidth = 10;
                    characterprerender[y][x] = largelowercaseq[y][x];
                    break;
                case 114:
                    charwidth = 8;
                    characterprerender[y][x] = largelowercaser[y][x];
                    break;
                case 115:
                    charwidth = 8;
                    characterprerender[y][x] = largelowercases[y][x];
                    break;
                case 116:
                    charwidth = 10;
                    characterprerender[y][x] = largelowercaset[y][x];
                    break;
                case 117:
                    charwidth = 8;
                    characterprerender[y][x] = largelowercaseu[y][x];
                    break;
                case 118:
                    charwidth = 9;
                    characterprerender[y][x] = largelowercasev[y][x];
                    break;
                case 119:
                    charwidth = 10;
                    characterprerender[y][x] = largelowercasew[y][x];
                    break;
                case 120:
                    charwidth = 10;
                    characterprerender[y][x] = largelowercasex[y][x];
                    break;
                case 121:
                    charwidth = 10;
                    characterprerender[y][x] = largelowercasey[y][x];
                    break;
                case 122:
                    charwidth = 10;
                    characterprerender[y][x] = largelowercasez[y][x];
                    break;
                case 123:
                    charwidth = 7;
                    characterprerender[y][x] = largeopeningcurlybrace[y][x];
                    break;
                case 124:
                    charwidth = 2;
                    characterprerender[y][x] = largeverticalpipe[y][x];
                    break;
                case 125:
                    charwidth = 7;
                    characterprerender[y][x] = largeclosingcurlybrace[y][x];
                    break;
                case 126:
                    charwidth = 10;
                    characterprerender[y][x] = largetilde[y][x];
                    break;
                case 127:
                    charwidth = 10;
                    characterprerender[y][x] = largebackspace[y][x];  //ASCII 127 is technically delete, but we use backspace on the DMD.
                    break;
                case 128:
                    charwidth = 10;
                    characterprerender[y][x] = largesquare[y][x];
                    break;
                    //                  case 129:
                    //                    charwidth =
                    //                    characterprerender[y][x] = large[y][x];
                    //                    break;
                    //                  case 130:
                    //                    charwidth =
                    //                    characterprerender[y][x] = large[y][x];
                    //                    break;
                    //                  case 131:
                    //                    charwidth =
                    //                    characterprerender[y][x] = large[y][x];
                    //                    break;
                    //                  case 132:
                    //                    charwidth =
                    //                    characterprerender[y][x] = large[y][x];
                    //                    break;
                    //                  case 133:
                    //                    charwidth =
                    //                    characterprerender[y][x] = large[y][x];
                    //                    break;
                    //                  case 134:
                    //                    charwidth =
                    //                    characterprerender[y][x] = large[y][x];
                    //                    break;
                    //                  case 135:
                    //                    charwidth =
                    //                    characterprerender[y][x] = large[y][x];
                    //                    break;
                    //                  case 136:
                    //                    charwidth =
                    //                    characterprerender[y][x] = large[y][x];
                    //                    break;
                    //                  case 137:
                    //                    charwidth =
                    //                    characterprerender[y][x] = large[y][x];
                    //                    break;
                    //                  case 138:
                    //                    charwidth =
                    //                    characterprerender[y][x] = large[y][x];
                    //                    break;
                    //                  case 139:
                    //                    charwidth =
                    //                    characterprerender[y][x] = large[y][x];
                    //                    break;
                }
            }
            else if (font == 2)
            {
                switch (character) { //Oh boy!
                case 32:
                    charwidth = 5;
                    characterprerender[y][x] = smallspace[y][x];
                    break;
                case 33:
                    charwidth = 1;
                    characterprerender[y][x] = smallexclamationmark[y][x];
                    break;
                case 34:
                    charwidth = 3;
                    characterprerender[y][x] = smalldoublequote[y][x];
                    break;
                case 35:
                    charwidth = 5;
                    characterprerender[y][x] = smallhashtag[y][x];
                    break;
                case 36:
                    charwidth = 5;
                    characterprerender[y][x] = smalldollarsign[y][x];
                    break;
                case 37:
                    charwidth = 5;
                    characterprerender[y][x] = smallpercent[y][x];
                    break;
                case 38:
                    charwidth = 5;
                    characterprerender[y][x] = smallampersand[y][x];
                    break;
                case 39:
                    charwidth = 1;
                    characterprerender[y][x] = smallsinglequote[y][x];
                    break;
                case 40:
                    charwidth = 3;
                    characterprerender[y][x] = smallopeningparentheses[y][x];
                    break;
                case 41:
                    charwidth = 3;
                    characterprerender[y][x] = smallclosingparentheses[y][x];
                    break;
                case 42:
                    charwidth = 5;
                    characterprerender[y][x] = smallasterisk[y][x];
                    break;
                case 43:
                    charwidth = 5;
                    characterprerender[y][x] = smallplus[y][x];
                    break;
                case 44:
                    charwidth = 2;
                    characterprerender[y][x] = smallcomma[y][x];
                    break;
                case 45:
                    charwidth = 5;
                    characterprerender[y][x] = smallhyphen[y][x];
                    break;
                case 46:
                    charwidth = 2;
                    characterprerender[y][x] = smallperiod[y][x];
                    break;
                case 47:
                    charwidth = 5;
                    characterprerender[y][x] = smallslash[y][x];
                    break;
                case 48:
                    charwidth = 5;
                    characterprerender[y][x] = smallzero[y][x];
                    break;
                case 49:
                    charwidth = 5;
                    characterprerender[y][x] = smallone[y][x];
                    break;
                case 50:
                    charwidth = 5;
                    characterprerender[y][x] = smalltwo[y][x];
                    break;
                case 51:
                    charwidth = 5;
                    characterprerender[y][x] = smallthree[y][x];
                    break;
                case 52:
                    charwidth = 5;
                    characterprerender[y][x] = smallfour[y][x];
                    break;
                case 53:
                    charwidth = 5;
                    characterprerender[y][x] = smallfive[y][x];
                    break;
                case 54:
                    charwidth = 5;
                    characterprerender[y][x] = smallsix[y][x];
                    break;
                case 55:
                    charwidth = 5;
                    characterprerender[y][x] = smallseven[y][x];
                    break;
                case 56:
                    charwidth = 5;
                    characterprerender[y][x] = smalleight[y][x];
                    break;
                case 57:
                    charwidth = 5;
                    characterprerender[y][x] = smallnine[y][x];
                    break;
                case 58:
                    charwidth = 2;
                    characterprerender[y][x] = smallcolon[y][x];
                    break;
                case 59:
                    charwidth = 2;
                    characterprerender[y][x] = smallsemicolon[y][x];
                    break;
                case 60:
                    charwidth = 5;
                    characterprerender[y][x] = smalllessthan[y][x];
                    break;
                case 61:
                    charwidth = 5;
                    characterprerender[y][x] = smallequals[y][x];
                    break;
                case 62:
                    charwidth = 5;
                    characterprerender[y][x] = smallgreaterthan[y][x];
                    break;
                case 63:
                    charwidth = 5;
                    characterprerender[y][x] = smallquestionmark[y][x];
                    break;
                case 64:
                    charwidth = 7;
                    characterprerender[y][x] = smallatsymbol[y][x];
                    break;
                case 65:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasea[y][x];
                    break;
                case 66:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercaseb[y][x];
                    break;
                case 67:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasec[y][x];
                    break;
                case 68:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercased[y][x];
                    break;
                case 69:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasee[y][x];
                    break;
                case 70:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasef[y][x];
                    break;
                case 71:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercaseg[y][x];
                    break;
                case 72:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercaseh[y][x];
                    break;
                case 73:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasei[y][x];
                    break;
                case 74:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasej[y][x];
                    break;
                case 75:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasek[y][x];
                    break;
                case 76:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasel[y][x];
                    break;
                case 77:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasem[y][x];
                    break;
                case 78:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasen[y][x];
                    break;
                case 79:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercaseo[y][x];
                    break;
                case 80:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasep[y][x];
                    break;
                case 81:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercaseq[y][x];
                    break;
                case 82:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercaser[y][x];
                    break;
                case 83:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercases[y][x];
                    break;
                case 84:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercaset[y][x];
                    break;
                case 85:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercaseu[y][x];
                    break;
                case 86:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasev[y][x];
                    break;
                case 87:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasew[y][x];
                    break;
                case 88:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasex[y][x];
                    break;
                case 89:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasey[y][x];
                    break;
                case 90:
                    charwidth = 5;
                    characterprerender[y][x] = smalluppercasez[y][x];
                    break;
                case 91:
                    charwidth = 3;
                    characterprerender[y][x] = smallopeningbracket[y][x];
                    break;
                case 92:
                    charwidth = 5;
                    characterprerender[y][x] = smallbackslash[y][x];
                    break;
                case 93:
                    charwidth = 3;
                    characterprerender[y][x] = smallclosingbracket[y][x];
                    break;
                case 94:
                    charwidth = 5;
                    characterprerender[y][x] = smallcarat[y][x];
                    break;
                case 95:
                    charwidth = 5;
                    characterprerender[y][x] = smallunderscore[y][x];
                    break;
                case 96:
                    charwidth = 2;
                    characterprerender[y][x] = smallgraveaccent[y][x];
                    break;
                case 97:
                    charwidth = 5;
                    characterprerender[y][x] = smalllowercasea[y][x];
                    break;
                case 98:
                    charwidth = 4;
                    characterprerender[y][x] = smalllowercaseb[y][x];
                    break;
                case 99:
                    charwidth = 3;
                    characterprerender[y][x] = smalllowercasec[y][x];
                    break;
                case 100:
                    charwidth = 4;
                    characterprerender[y][x] = smalllowercased[y][x];
                    break;
                case 101:
                    charwidth = 4;
                    characterprerender[y][x] = smalllowercasee[y][x];
                    break;
                case 102:
                    charwidth = 5;
                    characterprerender[y][x] = smalllowercasef[y][x];
                    break;
                case 103:
                    charwidth = 5;
                    characterprerender[y][x] = smalllowercaseg[y][x];
                    break;
                case 104:
                    charwidth = 4;
                    characterprerender[y][x] = smalllowercaseh[y][x];
                    break;
                case 105:
                    charwidth = 1;
                    characterprerender[y][x] = smalllowercasei[y][x];
                    break;
                case 106:
                    charwidth = 4;
                    characterprerender[y][x] = smalllowercasej[y][x];
                    break;
                case 107:
                    charwidth = 4;
                    characterprerender[y][x] = smalllowercasek[y][x];
                    break;
                case 108:
                    charwidth = 1;
                    characterprerender[y][x] = smalllowercasel[y][x];
                    break;
                case 109:
                    charwidth = 5;
                    characterprerender[y][x] = smalllowercasem[y][x];
                    break;
                case 110:
                    charwidth = 4;
                    characterprerender[y][x] = smalllowercasen[y][x];
                    break;
                case 111:
                    charwidth = 4;
                    characterprerender[y][x] = smalllowercaseo[y][x];
                    break;
                case 112:
                    charwidth = 3;
                    characterprerender[y][x] = smalllowercasep[y][x];
                    break;
                case 113:
                    charwidth = 5;
                    characterprerender[y][x] = smalllowercaseq[y][x];
                    break;
                case 114:
                    charwidth = 4;
                    characterprerender[y][x] = smalllowercaser[y][x];
                    break;
                case 115:
                    charwidth = 4;
                    characterprerender[y][x] = smalllowercases[y][x];
                    break;
                case 116:
                    charwidth = 5;
                    characterprerender[y][x] = smalllowercaset[y][x];
                    break;
                case 117:
                    charwidth = 5;
                    characterprerender[y][x] = smalllowercaseu[y][x];
                    break;
                case 118:
                    charwidth = 5;
                    characterprerender[y][x] = smalllowercasev[y][x];
                    break;
                case 119:
                    charwidth = 5;
                    characterprerender[y][x] = smalllowercasew[y][x];
                    break;
                case 120:
                    charwidth = 5;
                    characterprerender[y][x] = smalllowercasex[y][x];
                    break;
                case 121:
                    charwidth = 5;
                    characterprerender[y][x] = smalllowercasey[y][x];
                    break;
                case 122:
                    charwidth = 5;
                    characterprerender[y][x] = smalllowercasez[y][x];
                    break;
                case 123:
                    charwidth = 4;
                    characterprerender[y][x] = smallopeningcurlybrace[y][x];
                    break;
                case 124:
                    charwidth = 1;
                    characterprerender[y][x] = smallverticalpipe[y][x];
                    break;
                case 125:
                    charwidth = 4;
                    characterprerender[y][x] = smallclosingcurlybrace[y][x];
                    break;
                case 126:
                    charwidth = 5;
                    characterprerender[y][x] = smalltilde[y][x];
                    break;
                case 127:
                    charwidth = 5;
                    characterprerender[y][x] = smallbackspace[y][x];  //ASCII 127 is technically delete, but we use backspace on the DMD.
                    break;
                case 128:
                    charwidth = 5;
                    characterprerender[y][x] = smallsquare[y][x];
                    break;
                    //                  case 129:
                    //                    charwidth = 8;
                    //                    characterprerender[y][x] = smallcopyright[y][x];
                    //                    break;
                    //                  case 130:
                    //                    charwidth =
                    //                    characterprerender[y][x] = small[y][x];
                    //                    break;
                    //                  case 131:
                    //                    charwidth =
                    //                    characterprerender[y][x] = small[y][x];
                    //                    break;
                    //                  case 132:
                    //                    charwidth =
                    //                    characterprerender[y][x] = small[y][x];
                    //                    break;
                    //                  case 133:
                    //                    charwidth =
                    //                    characterprerender[y][x] = small[y][x];
                    //                    break;
                    //                  case 134:
                    //                    charwidth =
                    //                    characterprerender[y][x] = small[y][x];
                    //                    break;
                    //                  case 135:
                    //                    charwidth =
                    //                    characterprerender[y][x] = small[y][x];
                    //                    break;
                    //                  case 136:
                    //                    charwidth =
                    //                    characterprerender[y][x] = small[y][x];
                    //                    break;
                    //                  case 137:
                    //                    charwidth =
                    //                    characterprerender[y][x] = small[y][x];
                    //                    break;
                    //                  case 138:
                    //                    charwidth =
                    //                    characterprerender[y][x] = small[y][x];
                    //                    break;
                    //                  case 139:
                    //                    charwidth =
                    //                    characterprerender[y][x] = small[y][x];
                    //                    break;
                case 184:
                    charwidth = 8;
                    characterprerender[y][x] = smallcopyright[y][x];
                    break;
                }
            }
        }
    }
    if (onlygetlength == false) //Don't waste time drawing if we are.
    {
        //Do all the image stuff.
        if (invert == true)
        {
            for (x = 0; x < charwidth; x++)
            {
                for (y = 0; y < charheight; y++)
                {
                    if (characterprerender[y][x] != 0)
                    {
                        characterprerender[y][x] == 0;
                    }
                    else if (characterprerender[y][x] != 1)
                    {
                        characterprerender[y][x] == 1;
                    }
                }
            }
        }
        if (shade != 1)
        {
            for (x = 0; x < charwidth; x++)
            {
                for (y = 0; y < charheight; y++)
                {
                    if (characterprerender[y][x] == 1)
                    {
                        characterprerender[y][x] = shade;
                    }
                }
            }
        }

        for (x = 0; x < charwidth; x++)
        {
            for (y = 0; y < charheight; y++)
            {
                if (replacebackground == true && characterprerender[y][x] == 0)
                {
                    masterbuffer[y + yshift][x + xshift] = characterprerender[y][x];
                }
                else if (replacebackground == false && characterprerender[y][x] == 0)
                {
                    //Do nothing
                }
                else
                {
                    masterbuffer[y + yshift][x + xshift] = characterprerender[y][x];
                }
            }
        }
    }
    return charwidth; //return the width of the character that was just printed.
}

byte DrawReallyBigNumber(unsigned long ReallyBigNumber, byte font, int xshift, int yshift, int shade, boolean invert, boolean replacebackground, byte justified, boolean IncludeCommas, byte MinimumDigits, boolean OnlyGetLength)
{
    byte DigitsOfReallyBigNumber[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    byte NumberOfDigits = 10;
    byte currentx = 0;
    byte currentwidth = 0;
    byte totalwidth = 0;

    //Split the really big number into base-10 digits
    while (ReallyBigNumber >= 1000000000)
    {
        ReallyBigNumber -= 1000000000;
        DigitsOfReallyBigNumber[0]++;
    }
    while (ReallyBigNumber >= 100000000)
    {
        ReallyBigNumber -= 100000000;
        DigitsOfReallyBigNumber[1]++;
    }
    while (ReallyBigNumber >= 10000000)
    {
        ReallyBigNumber -= 10000000;
        DigitsOfReallyBigNumber[2]++;
    }
    while (ReallyBigNumber >= 1000000)
    {
        ReallyBigNumber -= 1000000;
        DigitsOfReallyBigNumber[3]++;
    }
    while (ReallyBigNumber >= 100000)
    {
        ReallyBigNumber -= 100000;
        DigitsOfReallyBigNumber[4]++;
    }
    while (ReallyBigNumber >= 10000)
    {
        ReallyBigNumber -= 10000;
        DigitsOfReallyBigNumber[5]++;
    }
    while (ReallyBigNumber >= 1000)
    {
        ReallyBigNumber -= 1000;
        DigitsOfReallyBigNumber[6]++;
    }
    while (ReallyBigNumber >= 100)
    {
        ReallyBigNumber -= 100;
        DigitsOfReallyBigNumber[7]++;
    }
    while (ReallyBigNumber >= 10)
    {
        ReallyBigNumber -= 10;
        DigitsOfReallyBigNumber[8]++;
    }
    while (ReallyBigNumber >= 1)
    {
        ReallyBigNumber -= 1;
        DigitsOfReallyBigNumber[9]++;
    }

    //Figure out how many digits are really significant
    for (byte x = 0; x < 10; x++)
    {
        if (DigitsOfReallyBigNumber[x] == 0)
        {
            NumberOfDigits--;
        }
        else
        {
            break;
        }
    }

    if (NumberOfDigits < MinimumDigits)
    {
        NumberOfDigits = MinimumDigits;
    }

    //Get the length of all significant digits.
    for (int x = 0; x < NumberOfDigits; x++)
    {
        currentwidth = drawalphanumericcharacter(DigitsOfReallyBigNumber[9-x] + 48, font, xshift + currentx, yshift, shade, invert, replacebackground, 1);

        currentx += currentwidth; //Move to next character space
        currentx += 1; //Add a space between characters
    }
    //Account for any necessary commas
    if (IncludeCommas == 1)
    {
        if (NumberOfDigits > 9)
        {
            //3 commas
            currentwidth = drawalphanumericcharacter(ASCII_COMMA, font, xshift + currentx, yshift, shade, invert, replacebackground, 1);

            currentx += currentwidth * 3; //Move to next character space
            currentx += 3; //Add a space between characters
        }
        else if (NumberOfDigits > 6)
        {
            //2 commas
            currentwidth = drawalphanumericcharacter(ASCII_COMMA, font, xshift + currentx, yshift, shade, invert, replacebackground, 1);

            currentx += currentwidth * 2; //Move to next character space
            currentx += 2; //Add a space between characters
        }
        else if (NumberOfDigits > 3)
        {
            //1 comma
            currentwidth = drawalphanumericcharacter(ASCII_COMMA, font, xshift + currentx, yshift, shade, invert, replacebackground, 1);

            currentx += currentwidth; //Move to next character space
            currentx += 1; //Add a space between characters
        }
    }

    //Do the actual drawing
    if (OnlyGetLength == 0)
    {
        totalwidth = currentx - 1; //Gets rid of the space after the last character.
        currentx = 0;
        currentwidth = 0;

        //If justified == 0 there's nothing to do, since the function draws from left by default
        if (justified == 1) //Centered around xshift
        {
            xshift = xshift - (totalwidth / 2); //Should center it around whatever xshift was when it was passed into the function.
        }
        else if (justified == 2) //Align rightmost on xshift
        {
            xshift = xshift - totalwidth;
        }

        for (int x = (10 - NumberOfDigits); x < 10; x++)
        {
            currentwidth = drawalphanumericcharacter(DigitsOfReallyBigNumber[x] + 48, font, xshift + currentx, yshift, shade, invert, replacebackground, 0);

            currentx += currentwidth; //Move to next character space
            currentx += 1;            //Make sure there is a space between characters!

            if (IncludeCommas == 1)
            {
                if (x == 6 || x == 3 || x == 0) //add in the commas!
                {
                    currentwidth = drawalphanumericcharacter(ASCII_COMMA, font, xshift + currentx, yshift, shade, invert, replacebackground, 0);

                    currentx += currentwidth; //Move to next character space
                    currentx += 1;            //Make sure there is a space between characters!
                }
            }
        }
    }
    return currentx;
}

////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//            Score / DMD Image Handling              //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////

void DrawToBufferWhatShouldBeDrawnToBuffer()
{
    cleardisplay();
    
    if (DataReceived[1] == 0 && DataReceived[15] == 1) //Choose your railroad!
    {
        if (DataReceived[18] > 10)
        {
            drawalphanumericstring("CHOOSE A RAILROAD:", 2, 64, 2, 7, 0, 0, 1, 0);
        }
        else
        {
            if (DataReceived[18] > 9) //More than 1 digit in base 10
            {
                MathVariable = 0;
                MathVariableTwo = DataReceived[18];
                while (MathVariableTwo >= 10)
                {
                    MathVariableTwo -= 10;
                    MathVariable++;
                }
                drawalphanumericstring("TIME LEFT:", 2, 26, 2, 7, 0, 0, 0, 0);
                drawalphanumericcharacter(MathVariable + 48, 2, 89, 2, 7, 0, 0, 0);
                drawalphanumericcharacter(MathVariableTwo + 48, 2, 95, 2, 7, 0, 0, 0);
            }
            else
            {
                drawalphanumericstring("TIME LEFT:", 2, 29, 2, 7, 0, 0, 0, 0);
                drawalphanumericcharacter(DataReceived[18] + 48, 2, 92, 2, 7, 0, 0, 0);
            }
            
        }
        
        if (DataReceived[17] == 1) //CPRR
        {
            drawalphanumericstring("UNION", 2, 92, 14, 1, 0, 0, 1, 0);
            drawalphanumericstring("PACIFIC", 2, 92, 24, 1, 0, 0, 1, 0);
            
            drawalphanumericstring("CENTRAL", 2, 36, 14, 7, 0, 0, 1, 0);
            drawalphanumericstring("PACIFIC", 2, 36, 24, 7, 0, 0, 1, 0);
        }
        else if (DataReceived[17] == 2)//UPRR
        {
            drawalphanumericstring("UNION", 2, 92, 14, 7, 0, 0, 1, 0);
            drawalphanumericstring("PACIFIC", 2, 92, 24, 7, 0, 0, 1, 0);

            drawalphanumericstring("CENTRAL", 2, 36, 14, 1, 0, 0, 1, 0);
            drawalphanumericstring("PACIFIC", 2, 36, 24, 1, 0, 0, 1, 0);
        }
    }
    else if (DataReceived[1] == 0 && (DataReceived[12] != 0 || DataReceived[13] != 0)) //Game not started but credits present
    {
        if (CurrentProgramMillis > AttractModeSubStateMillis + 500)
        {
            AttractModeSubStateMillis = CurrentProgramMillis;
            if (AttractModeSubState == 0)
            {
                AttractModeSubState = 1;
            }
            else
            {
                AttractModeSubState = 0;
            }
        }
        if (AttractModeSubState == 1)
        {
            drawalphanumericstring("PRESS START", 1, 64, 4, 7, 0, 0, 1, 0);
        }
        else
        {
            drawalphanumericstring("PRESS START", 1, 64, 4, 1, 0, 0, 1, 0);
        }
        drawcreditnumber(67, 24, 7);
        drawalphanumericstring("GAME OVER", 2, 32, 24, 7, 0, 0, 1, 0);
    }
    else if (DataReceived[1] == 0 && DataReceived[15] == 14) //Self-test mode
    {
        if (DataReceived[16] == 1) //High Score loading actually happens after a self-test pass.
        {
            drawalphanumericstring("LOADING HIGH SCORES", 2, 64, 12, 7, 0, 0, 1, 0);

            switch (DataReceived[18])
            {
            case 1:
                //Initials
                HighScoreArray[0][0] = DataReceived[2];
                HighScoreArray[0][1] = DataReceived[3];
                HighScoreArray[0][2] = DataReceived[4];
                HighScoreArray[0][3] = DataReceived[5];
                HighScoreArray[0][4] = DataReceived[6];
                break;
            case 2:
                //Score
                HighScoreArray[0][5] = DataReceived[2];
                HighScoreArray[0][6] = DataReceived[3];
                HighScoreArray[0][7] = DataReceived[4];
                HighScoreArray[0][8] = DataReceived[5];
                HighScoreArray[0][9] = DataReceived[6];
                HighScoreArray[0][10] = DataReceived[7];
                HighScoreArray[0][11] = DataReceived[8];
                HighScoreArray[0][12] = DataReceived[9];
                HighScoreArray[0][13] = DataReceived[10];
                HighScoreArray[0][14] = DataReceived[11];
                break;
            case 3:
                //Initials
                HighScoreArray[1][0] = DataReceived[2];
                HighScoreArray[1][1] = DataReceived[3];
                HighScoreArray[1][2] = DataReceived[4];
                HighScoreArray[1][3] = DataReceived[5];
                HighScoreArray[1][4] = DataReceived[6];
                break;
            case 4:
                //Score
                HighScoreArray[1][5] = DataReceived[2];
                HighScoreArray[1][6] = DataReceived[3];
                HighScoreArray[1][7] = DataReceived[4];
                HighScoreArray[1][8] = DataReceived[5];
                HighScoreArray[1][9] = DataReceived[6];
                HighScoreArray[1][10] = DataReceived[7];
                HighScoreArray[1][11] = DataReceived[8];
                HighScoreArray[1][12] = DataReceived[9];
                HighScoreArray[1][13] = DataReceived[10];
                HighScoreArray[1][14] = DataReceived[11];
                break;
            case 5:
                //Initials
                HighScoreArray[2][0] = DataReceived[2];
                HighScoreArray[2][1] = DataReceived[3];
                HighScoreArray[2][2] = DataReceived[4];
                HighScoreArray[2][3] = DataReceived[5];
                HighScoreArray[2][4] = DataReceived[6];
                break;
            case 6:
                //Score
                HighScoreArray[2][5] = DataReceived[2];
                HighScoreArray[2][6] = DataReceived[3];
                HighScoreArray[2][7] = DataReceived[4];
                HighScoreArray[2][8] = DataReceived[5];
                HighScoreArray[2][9] = DataReceived[6];
                HighScoreArray[2][10] = DataReceived[7];
                HighScoreArray[2][11] = DataReceived[8];
                HighScoreArray[2][12] = DataReceived[9];
                HighScoreArray[2][13] = DataReceived[10];
                HighScoreArray[2][14] = DataReceived[11];
                break;
            case 7:
                //Initials
                HighScoreArray[3][0] = DataReceived[2];
                HighScoreArray[3][1] = DataReceived[3];
                HighScoreArray[3][2] = DataReceived[4];
                HighScoreArray[3][3] = DataReceived[5];
                HighScoreArray[3][4] = DataReceived[6];
                break;
            case 8:
                //Score
                HighScoreArray[3][5] = DataReceived[2];
                HighScoreArray[3][6] = DataReceived[3];
                HighScoreArray[3][7] = DataReceived[4];
                HighScoreArray[3][8] = DataReceived[5];
                HighScoreArray[3][9] = DataReceived[6];
                HighScoreArray[3][10] = DataReceived[7];
                HighScoreArray[3][11] = DataReceived[8];
                HighScoreArray[3][12] = DataReceived[9];
                HighScoreArray[3][13] = DataReceived[10];
                HighScoreArray[3][14] = DataReceived[11];
                break;
            case 9:
                //Initials
                HighScoreArray[4][0] = DataReceived[2];
                HighScoreArray[4][1] = DataReceived[3];
                HighScoreArray[4][2] = DataReceived[4];
                HighScoreArray[4][3] = DataReceived[5];
                HighScoreArray[4][4] = DataReceived[6];
                break;
            case 10:
                //Score
                HighScoreArray[4][5] = DataReceived[2];
                HighScoreArray[4][6] = DataReceived[3];
                HighScoreArray[4][7] = DataReceived[4];
                HighScoreArray[4][8] = DataReceived[5];
                HighScoreArray[4][9] = DataReceived[6];
                HighScoreArray[4][10] = DataReceived[7];
                HighScoreArray[4][11] = DataReceived[8];
                HighScoreArray[4][12] = DataReceived[9];
                HighScoreArray[4][13] = DataReceived[10];
                HighScoreArray[4][14] = DataReceived[11];
                break;
            case 11:
                //Initials
                HighScoreArray[5][0] = DataReceived[2];
                HighScoreArray[5][1] = DataReceived[3];
                HighScoreArray[5][2] = DataReceived[4];
                HighScoreArray[5][3] = DataReceived[5];
                HighScoreArray[5][4] = DataReceived[6];
                break;
            case 12:
                //Score
                HighScoreArray[5][5] = DataReceived[2];
                HighScoreArray[5][6] = DataReceived[3];
                HighScoreArray[5][7] = DataReceived[4];
                HighScoreArray[5][8] = DataReceived[5];
                HighScoreArray[5][9] = DataReceived[6];
                HighScoreArray[5][10] = DataReceived[7];
                HighScoreArray[5][11] = DataReceived[8];
                HighScoreArray[5][12] = DataReceived[9];
                HighScoreArray[5][13] = DataReceived[10];
                HighScoreArray[5][14] = DataReceived[11];
                break;
            case 13:
                //Initials
                HighScoreArray[6][0] = DataReceived[2];
                HighScoreArray[6][1] = DataReceived[3];
                HighScoreArray[6][2] = DataReceived[4];
                HighScoreArray[6][3] = DataReceived[5];
                HighScoreArray[6][4] = DataReceived[6];
                break;
            case 14:
                //Score
                HighScoreArray[6][5] = DataReceived[2];
                HighScoreArray[6][6] = DataReceived[3];
                HighScoreArray[6][7] = DataReceived[4];
                HighScoreArray[6][8] = DataReceived[5];
                HighScoreArray[6][9] = DataReceived[6];
                HighScoreArray[6][10] = DataReceived[7];
                HighScoreArray[6][11] = DataReceived[8];
                HighScoreArray[6][12] = DataReceived[9];
                HighScoreArray[6][13] = DataReceived[10];
                HighScoreArray[6][14] = DataReceived[11];
                break;
            case 15:
                //Initials
                HighScoreArray[7][0] = DataReceived[2];
                HighScoreArray[7][1] = DataReceived[3];
                HighScoreArray[7][2] = DataReceived[4];
                HighScoreArray[7][3] = DataReceived[5];
                HighScoreArray[7][4] = DataReceived[6];
                break;
            case 16:
                //Score
                HighScoreArray[7][5] = DataReceived[2];
                HighScoreArray[7][6] = DataReceived[3];
                HighScoreArray[7][7] = DataReceived[4];
                HighScoreArray[7][8] = DataReceived[5];
                HighScoreArray[7][9] = DataReceived[6];
                HighScoreArray[7][10] = DataReceived[7];
                HighScoreArray[7][11] = DataReceived[8];
                HighScoreArray[7][12] = DataReceived[9];
                HighScoreArray[7][13] = DataReceived[10];
                HighScoreArray[7][14] = DataReceived[11];
                break;
            case 17:
                //Initials
                HighScoreArray[8][0] = DataReceived[2];
                HighScoreArray[8][1] = DataReceived[3];
                HighScoreArray[8][2] = DataReceived[4];
                HighScoreArray[8][3] = DataReceived[5];
                HighScoreArray[8][4] = DataReceived[6];
                break;
            case 18:
                //Score
                HighScoreArray[8][5] = DataReceived[2];
                HighScoreArray[8][6] = DataReceived[3];
                HighScoreArray[8][7] = DataReceived[4];
                HighScoreArray[8][8] = DataReceived[5];
                HighScoreArray[8][9] = DataReceived[6];
                HighScoreArray[8][10] = DataReceived[7];
                HighScoreArray[8][11] = DataReceived[8];
                HighScoreArray[8][12] = DataReceived[9];
                HighScoreArray[8][13] = DataReceived[10];
                HighScoreArray[8][14] = DataReceived[11];
                break;
            }
        }
        else if (DataReceived[16] == 2) //SD Initialized
        {
            drawalphanumericstring("SD INITIALIZED", 2, 64, 12, 7, 0, 0, 1, 0);
        }
        else if (DataReceived[16] == 3) //SD Failure
        {
            drawalphanumericstring("SD FAILURE", 2, 64, 12, 7, 0, 0, 1, 0);
        }
        else if (DataReceived[16] == 4) //Wrong # of balls
        {
            drawalphanumericstring("THERE SHOULD BE", 2, 64, 2, 7, 0, 0, 1, 0);

            MultiStringWidth = 0;
            MultiStringWidth += DrawReallyBigNumber(DataReceived[17], 2, 0, 12, 7, 0, 0, 0, 0, 1, 1);
            MultiStringWidth += drawalphanumericstring(" BALLS", 2, 0, 12, 7, 0, 0, 0, 1);

            CursorX = 64 - (MultiStringWidth / 2);
            CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 12, 7, 0, 0, 0, 0, 1, 0);
            CursorX += drawalphanumericstring(" BALLS", 2, CursorX, 12, 7, 0, 0, 0, 0);

            drawalphanumericstring("INSTALLED THE TROUGH", 2, 64, 22, 7, 0, 0, 1, 0);
        }
        else if (DataReceived[16] == 5) //Correct # of balls
        {
            drawalphanumericstring("THE CORRECT NUMBER", 2, 64, 2, 7, 0, 0, 1, 0);
            drawalphanumericstring("OF BALLS HAVE BEEN", 2, 64, 12, 7, 0, 0, 1, 0);
            drawalphanumericstring("INSTALLED", 2, 64, 22, 7, 0, 0, 1, 0);
        }
        else if (DataReceived[16] == 6) //SELF-TEST Pass
        {
            drawalphanumericstring("GOLDEN SPIKE HAS", 2, 64, 7, 7, 0, 0, 1, 0);
            drawalphanumericstring("PASSED ITS SELF-TEST", 2, 64, 17, 7, 0, 0, 1, 0);
        }
        else if (DataReceived[16] == 7)
        {
            drawalphanumericstring("HIGH SCORES FAILED", 2, 64, 7, 7, 0, 0, 1, 0);
            drawalphanumericstring("TO LOAD", 2, 64, 17, 7, 0, 0, 1, 0);
        }
    }
    else if (DataReceived[1] == 0) //Attract mode
    {
        if (HasItHappenedYet == 0)
        {
            HasItHappenedYet = 1;
            LastImageMillis = CurrentProgramMillis;
        }
        
        if (CurrentProgramMillis > LastImageMillis + 4000 && AttractModeStage == 0)
        {
            AttractModeStage++;
            LastImageMillis = CurrentProgramMillis;
        }
        if (CurrentProgramMillis > LastImageMillis + 2500 && AttractModeStage == 1)
        {
            HighScoreSequenceNumber++;
            LastImageMillis = CurrentProgramMillis;
            if (HighScoreSequenceNumber == 9)
            {
                HighScoreSequenceNumber = 1;
                AttractModeStage = 2;
            }
        }
        if (CurrentProgramMillis > LastImageMillis + 10000 && AttractModeStage == 2)
        {
            AttractModeStage = 0;
            AttractModeSubState = 1;
            LastImageMillis = CurrentProgramMillis;
        }
        if (CurrentProgramMillis > AttractModeSubStateMillis + 2500)
        {
            AttractModeSubStateMillis = CurrentProgramMillis;
            if (AttractModeSubState == 0)
            {
                AttractModeSubState = 1;
            }
            else
            {
                AttractModeSubState = 0;
            }
        }
        
        switch (AttractModeStage)
        {
        case 0:
            //     GOLDEN SPIKE
            //(c) Kincaid Arcade 2021
            drawalphanumericstring("GOLDEN", 1, 32, 4, 7, 0, 0, 1, 0);
            drawalphanumericstring("SPIKE", 1, 101, 4, 7, 0, 0, 1, 0); //I had to do it this way because the string "Golden Spike" was wider than the DMD
            drawalphanumericcharacter(ASCII_COPYRIGHT, 2, 0, 24, 7, 0, 0, 0);
            drawalphanumericstring(" KINCAID ARCADE 2021", 2, 9, 24, 7, 0, 0, 0, 0);
            break;
        case 1:
            //Show High Scores
            drawalphanumericstring("HIGH SCORES:", 2, 64, 2, 7, 0, 0, 1, 0);
            drawsmallhighscorenumber(1, 14, HighScoreSequenceNumber, 7);
            drawsmallhighscorenumber(1, 24, HighScoreSequenceNumber + 1, 7);
            break;
        case 2:
            //Show the previous game's score, flash INSERT COINS
            DrawReallyBigNumber(AssembledPlayerScore, 1, 64, 4, 7, 0, 0, 1, 1, 2, 0);
            if(AttractModeSubState == 1)
            {
                drawplayernumber(8, 24, 1, 7);
                drawalphanumericstring("GAME OVER", 2, 96, 24, 7, 0, 0, 1, 0);
            }
            else
            {
                if (DataReceived[17] == 0)
                {
                    drawalphanumericstring("FREE PLAY", 2, 64, 24, 7, 0, 0, 1, 0);
                }
                else if(DataReceived[17] != 0)
                {
                    drawalphanumericstring("INSERT COINS", 2, 64, 24, 7, 0, 0, 1, 0);
                }
            }
            break;
        }
    }
    else if (DataReceived[1] == 1 && DataReceived[15] == 2) //End-Of-Ball Bonus
    {
        switch (DataReceived[16])
        {
        case 1: //BONUS screen
            if (HasItHappenedYet == 0)
            {
                HasItHappenedYet = 1;
                TotalEndOfBallBonus = 0;
                TotalMilesOfTrack = 0;
            }

            drawalphanumericstring("BONUS", 1, 64, 8, 7, 0, 0, 1, 0);

            break;
        case 2: //Track
            if (HasItHappenedYet == 0)
            {
                MathVariable = DataReceived[17];
                TotalMilesOfTrack = DataReceived[18];
                while (MathVariable > 0)
                {
                    MathVariable--;
                    TotalMilesOfTrack += 256;
                }
                
                MathVariable = DataReceived[19]*256;
                MathVariable += DataReceived[20];

                HasItHappenedYet = 1;
                TotalEndOfBallBonus += TotalMilesOfTrack * MathVariable;

                ModeSubstateMillis = CurrentProgramMillis;
            }

            drawalphanumericstring("MILES OF TRACK", 2, 64, 2, 7, 0, 0, 1, 0);

            if (CurrentProgramMillis > ModeSubstateMillis + 500)
            {
                ModeSubstate++;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            //This should progressively re-center each loop if it changes
            MultiStringWidth = 0;
            MultiStringWidth += DrawReallyBigNumber(TotalMilesOfTrack, 2, 0, 17, 7, 0, 0, 0, 1, 1, 1);
            MultiStringWidth += drawalphanumericcharacter(ASCII_SPACE, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += drawalphanumericcharacter(ASCII_SPACE, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += DrawReallyBigNumber(MathVariable, 2, 0, 17, 7, 0, 0, 0, 1, 1, 1);

            CursorX = 64 - (MultiStringWidth / 2);

            if (ModeSubstate == 0)
            {
                //Do nothing
            }
            else if (ModeSubstate == 1)
            {
                CursorX += DrawReallyBigNumber(TotalMilesOfTrack, 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
            }
            else if (ModeSubstate == 2)
            {
                CursorX += DrawReallyBigNumber(TotalMilesOfTrack, 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX++;
                CursorX += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, CursorX, 17, 7, 0, 0, 0);
            }
            else if (ModeSubstate == 3)
            {
                CursorX += DrawReallyBigNumber(TotalMilesOfTrack, 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX++;
                CursorX += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX++;
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX++;
                CursorX += DrawReallyBigNumber(MathVariable, 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
            }
            else
            {
                DrawReallyBigNumber(TotalMilesOfTrack* MathVariable, 1, 64, 13, 7, 0, 0, 1, 1, 2, 0);
            }

            break;
        case 3: //The date is
        {
            if (HasItHappenedYet == 0)
            {
                HasItHappenedYet = 1;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            if (CurrentProgramMillis > ModeSubstateMillis + 550)
            {
                ModeSubstate++;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            drawalphanumericstring("IT IS", 2, 64, 2, 7, 0, 0, 1, 0);

            if (ModeSubstate > 1)
            {
                if (DataReceived[18] == 1) //CPRR
                {
                    //Locations from start to end (source: https://www.up.com/goldenspike/index.html) Distances approximated w/ google maps since data unavailible.
                    //Sacramento, CA (distances off, all scaled to match 690)
                    //Roseville, CA         20 mi
                    //Rocklin, CA           24 mi
                    //Newcastle, CA         31 mi
                    //Auburn, CA            34 mi
                    //Colfax, CA            51 mi
                    //Truckee, CA           104 mi
                    //Reno, NV              137 mi
                    //Sparks, NV            140 mi
                    //Fernley, NV           171 mi
                    //Lovelock, NV          232 mi
                    //Winnemucca, NV        308 mi
                    //Battle Mountain, NV   363 mi
                    //Elko, NV              436 mi
                    //Promontory Summit, UT 690 mi
                    if (TotalMilesOfTrack >= 690) //Promontory Summit, UT
                    {
                        drawalphanumericstring("MAY 10TH, 1869", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 436) //Elko, NV
                    {
                        drawalphanumericstring("JANUARY 25TH, 1869", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 363) //Battle Mountain, NV
                    {
                        drawalphanumericstring("OCTOBER 21ST, 1868", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 308) //Winnemucca, NV
                    {
                        drawalphanumericstring("OCTOBER 1ST, 1868", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 232) //Lovelock, NV
                    {
                        drawalphanumericstring("SEPTEMBER 20TH, 1868", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 171) //Fernley, NV
                    {
                        drawalphanumericstring("SUMMER, 1868", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 140) //Sparks, NV
                    {
                        drawalphanumericstring("LATE JUNE, 1868", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 137) //Reno, NV
                    {
                        drawalphanumericstring("JUNE 19th, 1868", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 104) //Truckee, CA
                    {
                        drawalphanumericstring("APRIL 3RD, 1868", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 51) //Colfax, CA
                    {
                        drawalphanumericstring("SEPTEMBER 1ST, 1865", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 34) //Auburn, CA
                    {
                        drawalphanumericstring("MAY 13TH, 1865", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 31) //Newcastle, CA
                    {
                        drawalphanumericstring("JUNE 6TH, 1864", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 24) //Rocklin, CA
                    {
                        drawalphanumericstring("JUNE 6TH, 1864", 2, 64, 17, 7, 0, 0, 1, 0); //I guess the dates are when trains started arriving?
                    }
                    else if (TotalMilesOfTrack >= 20) //Roseville, CA
                    {
                        drawalphanumericstring("APRIL 26TH, 1864", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else //Sacramento, CA           OOOOOOOOOF. Your ball drained without getting a SINGLE MILE of track built. SDTM!
                    {
                        drawalphanumericstring("OCTOBER 26TH, 1863", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                }
                else if (DataReceived[18] == 2) //UPRR
                {
                    //Locations from start to end (source: https://www.up.com/goldenspike/index.html) Distances approximated w/ google maps since data unavailible.
                    //Omaha, NE (distances off, all scaled to match 1086)
                    //Fremont, NE           46 mi
                    //Schuyler, NE          84 mi
                    //Columbus, NE          102 mi
                    //Central City, NE      134 mi
                    //Grand Island, NE      165 mi
                    //Wood River, NE        174 mi
                    //Gibbon, NE            192 mi
                    //Kearney, NE           205 mi
                    //Lexington, NE         245 mi
                    //Cozad, NE             260 mi
                    //Gothenburg, NE        272 mi
                    //North Platte, NE      311 mi
                    //Hershey, NE           324 mi
                    //Paxton, NE            344 mi
                    //Ogallala, NE          366 mi
                    //Julesburg, CO         400 mi
                    //Chappel, NE           412 mi
                    //Sidney, NE            443 mi
                    //Kimball, NE           483 mi
                    //Cheyenne, WY          552 mi
                    //Laramie, WY           607 mi
                    //Hanna, WY             682 mi
                    //Rawlins, WY           715 mi
                    //Rock Springs, WY      834 mi
                    //Green River, WY       852 mi
                    //Evanston, WY          946 mi
                    //Uintah, UT            1019 mi
                    //Ogden, UT             1030 mi
                    //Corrine, UT           1058 mi
                    //Promontory Summit, UT 1086 mi
                    if (TotalMilesOfTrack >= 1086) //Promontory Summit, UT
                    {
                        drawalphanumericstring("MAY 10TH, 1869", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 1058) //Corrine, UT
                    {
                        drawalphanumericstring("MARCH 27TH, 1869", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 1030) //Ogden, UT
                    {
                        drawalphanumericstring("MARCH 7TH, 1869", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 1019) //Uintah, UT
                    {
                        drawalphanumericstring("JULY, 1869", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 946) //Evanstown, WY
                    {
                        drawalphanumericstring("DECEMBER 4TH, 1868", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 852) //Green River, WY      Definitely won't be drinkin' that anytime soon
                    {
                        drawalphanumericstring("OCTOBER 4TH, 1868", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 834) //Rock Springs, WY
                    {
                        drawalphanumericstring("AUGUST, 1868", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 715) //Rawlins, WY
                    {
                        drawalphanumericstring("AUGUST 8TH, 1868", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 682) //Hanna, WY
                    {
                        drawalphanumericstring("JULY, 1868", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 607) //Laramie, WY
                    {
                        drawalphanumericstring("JUNE 7TH, 1868", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 552) //Cheyenne, WY
                    {
                        drawalphanumericstring("NOVEMBER 13TH, 1867", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 483) //Kimball, NE
                    {
                        drawalphanumericstring("AUGUST 29TH, 1867", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 443) //Sidney, NE
                    {
                        drawalphanumericstring("AUGUST 10TH, 1867", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 412) //Chappel, NE
                    {
                        drawalphanumericstring("JULY, 1868", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 400) //Julesburg, CO
                    {
                        drawalphanumericstring("JUNE 24TH, 1867", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 366) //Ogallala, NE
                    {
                        drawalphanumericstring("MAY 24TH, 1867", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 344) //Paxton, NE
                    {
                        drawalphanumericstring("JUNE, 1867", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 324) //Hershey, NE
                    {
                        drawalphanumericstring("DECEMBER, 1866", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 311) //North Platte, NE
                    {
                        drawalphanumericstring("DECEMBER 3RD, 1866", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 272) //Gothenburg, NE
                    {
                        drawalphanumericstring("WINTER, 1866", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 260) //Cozad, NE
                    {
                        drawalphanumericstring("OCTOBER 6TH, 1866", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 245) //Lexington, NE
                    {
                        drawalphanumericstring("SEPTEMBER 25TH, 1866", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 205) //Kearny, NE
                    {
                        drawalphanumericstring("AUGUST, 1866", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 192) //Gibbon, NE
                    {
                        drawalphanumericstring("AUGUST, 1866", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 174) //Wood River, NE
                    {
                        drawalphanumericstring("AUGUST, 1866", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 165) //Grand Island, NE
                    {
                        drawalphanumericstring("JULY 8TH, 1866", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 134) //Central City, NE
                    {
                        drawalphanumericstring("SUMMER, 1866", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 102) //Columbus, NE
                    {
                        drawalphanumericstring("JUNE 2ND, 1866", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 84) //Schuyler, NE
                    {
                        drawalphanumericstring("MAY 3RD, 1866", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else if (TotalMilesOfTrack >= 46) //Fremont, NE
                    {
                        drawalphanumericstring("JANUARY 24TH, 1866", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                    else //Omaha, NE
                    {
                        drawalphanumericstring("JULY 10TH, 1865", 2, 64, 17, 7, 0, 0, 1, 0);
                    }
                }
            }
            break;
        }
        case 4: //The Tracks Have Reached
        {
            if (HasItHappenedYet == 0)
            {
                HasItHappenedYet = 1;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            if (CurrentProgramMillis > ModeSubstateMillis + 550)
            {
                ModeSubstate++;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            drawalphanumericstring("THE TRACKS REACHED:", 2, 64, 2, 7, 0, 0, 1, 0);

            if (ModeSubstate > 1)
            {
                if (DataReceived[18] == 1) //CPRR
                {
                    //Locations from start to end (source: https://www.up.com/goldenspike/index.html) Distances approximated w/ google maps since data unavailible.
                    //Sacramento, CA (distances off, all scaled to match 690)
                    //Roseville, CA         20 mi
                    //Rocklin, CA           24 mi
                    //Newcastle, CA         31 mi
                    //Auburn, CA            34 mi
                    //Colfax, CA            51 mi
                    //Truckee, CA           104 mi
                    //Reno, NV              137 mi
                    //Sparks, NV            140 mi
                    //Fernley, NV           171 mi
                    //Lovelock, NV          232 mi
                    //Winnemucca, NV        308 mi
                    //Battle Mountain, NV   363 mi
                    //Elko, NV              436 mi
                    //Promontory Summit, UT 690 mi
                    if (TotalMilesOfTrack >= 690) //Promontory Summit, UT
                    {
                        drawalphanumericstring("PROMONTORY SUMMIT", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("UTAH", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 436) //Elko, NV
                    {
                        drawalphanumericstring("ELKO", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEVADA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 363) //Battle Mountain, NV
                    {
                        drawalphanumericstring("BATTLE MOUNTAIN", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEVADA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 308) //Winnemucca, NV
                    {
                        drawalphanumericstring("WINNEMUCCA", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEVADA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 232) //Lovelock, NV
                    {
                        drawalphanumericstring("LOVELOCK", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEVADA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 171) //Fernley, NV
                    {
                        drawalphanumericstring("FERNLEY", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEVADA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 140) //Sparks, NV
                    {
                        drawalphanumericstring("SPARKS", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEVADA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 137) //Reno, NV
                    {
                        drawalphanumericstring("RENO", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEVADA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 104) //Truckee, CA
                    {
                        drawalphanumericstring("TRUCKEE", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("CALIFORNIA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 51) //Colfax, CA
                    {
                        drawalphanumericstring("COLFAX", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("CALIFORNIA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 34) //Auburn, CA
                    {
                        drawalphanumericstring("AUBURN", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("CALIFORNIA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 31) //Newcastle, CA
                    {
                        drawalphanumericstring("NEWCASTLE", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("CALIFORNIA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 24) //Rocklin, CA
                    {
                        drawalphanumericstring("ROCKLIN", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("CALIFORNIA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 20) //Roseville, CA
                    {
                        drawalphanumericstring("ROSEVILLE", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("CALIFORNIA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else //Sacramento, CA           OOOOOOOOOF. Your ball drained without getting a SINGLE MILE of track built. SDTM!
                    {
                        drawalphanumericstring("SACRAMENTO", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("CALIFORNIA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                }
                else if (DataReceived[18] == 2) //UPRR
                {
                    //Locations from start to end (source: https://www.up.com/goldenspike/index.html) Distances approximated w/ google maps since data unavailible.
                    //Omaha, NE (distances off, all scaled to match 1086)
                    //Fremont, NE           46 mi
                    //Schuyler, NE          84 mi
                    //Columbus, NE          102 mi
                    //Central City, NE      134 mi
                    //Grand Island, NE      165 mi
                    //Wood River, NE        174 mi
                    //Gibbon, NE            192 mi
                    //Kearney, NE           205 mi
                    //Lexington, NE         245 mi
                    //Cozad, NE             260 mi
                    //Gothenburg, NE        272 mi
                    //North Platte, NE      311 mi
                    //Hershey, NE           324 mi
                    //Paxton, NE            344 mi
                    //Ogallala, NE          366 mi
                    //Julesburg, CO         400 mi
                    //Chappel, NE           412 mi
                    //Sidney, NE            443 mi
                    //Kimball, NE           483 mi
                    //Cheyenne, WY          552 mi
                    //Laramie, WY           607 mi
                    //Hanna, WY             682 mi
                    //Rawlins, WY           715 mi
                    //Rock Springs, WY      834 mi
                    //Green River, WY       852 mi
                    //Evanston, WY          946 mi
                    //Uintah, UT            1019 mi
                    //Ogden, UT             1030 mi
                    //Corrine, UT           1058 mi
                    //Promontory Summit, UT 1086 mi
                    if (TotalMilesOfTrack >= 1086) //Promontory Summit, UT
                    {
                        drawalphanumericstring("PROMONTORY SUMMIT", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("UTAH", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 1058) //Corrine, UT
                    {
                        drawalphanumericstring("CORRINE", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("UTAH", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 1030) //Ogden, UT
                    {
                        drawalphanumericstring("OGDEN", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("UTAH", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 1019) //Uintah, UT
                    {
                        drawalphanumericstring("UINTAH", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("UTAH", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 946) //Evanstown, WY
                    {
                        drawalphanumericstring("EVANSTOWN", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("WYOMING", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 852) //Green River, WY      Definitely won't be drinkin' that anytime soon
                    {
                        drawalphanumericstring("GREEN RIVER", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("WYOMING", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 834) //Rock Springs, WY
                    {
                        drawalphanumericstring("ROCK SPIRNGS", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("WYOMING", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 715) //Rawlins, WY
                    {
                        drawalphanumericstring("RAWLINS", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("WYOMING", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 682) //Hanna, WY
                    {
                        drawalphanumericstring("HANNA", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("WYOMING", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 607) //Laramie, WY
                    {
                        drawalphanumericstring("LARAMIE", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("WYOMING", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 552) //Cheyenne, WY
                    {
                        drawalphanumericstring("CHEYENNE", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("WYOMING", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 483) //Kimball, NE
                    {
                        drawalphanumericstring("KIMBALL", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 443) //Sidney, NE
                    {
                        drawalphanumericstring("SIDNEY", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 412) //Chappel, NE
                    {
                        drawalphanumericstring("CHAPPEL", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 400) //Julesburg, CO
                    {
                        drawalphanumericstring("JULESBURG", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("COLORADO", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 366) //Ogallala, NE
                    {
                        drawalphanumericstring("OGALLALA", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 344) //Paxton, NE
                    {
                        drawalphanumericstring("PAXTON", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 324) //Hershey, NE
                    {
                        drawalphanumericstring("HERSHEY", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 311) //North Platte, NE
                    {
                        drawalphanumericstring("NORTH PLATTE", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 272) //Gothenburg, NE
                    {
                        drawalphanumericstring("GOTHENBURG", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 260) //Cozad, NE
                    {
                        drawalphanumericstring("COZAD", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 245) //Lexington, NE
                    {
                        drawalphanumericstring("LEXINGTON", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 205) //Kearny, NE
                    {
                        drawalphanumericstring("KEARNY", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 192) //Gibbon, NE
                    {
                        drawalphanumericstring("GIBBON", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 174) //Wood River, NE
                    {
                        drawalphanumericstring("GOTHENBURG", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 165) //Grand Island, NE
                    {
                        drawalphanumericstring("GRAND ISLAND", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 134) //Central City, NE
                    {
                        drawalphanumericstring("CENTRAL CITY", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 102) //Columbus, NE
                    {
                        drawalphanumericstring("COLUMBUS", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 84) //Schuyler, NE
                    {
                        drawalphanumericstring("SCHUYLER", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else if (TotalMilesOfTrack >= 46) //Fremont, NE
                    {
                        drawalphanumericstring("FREMONT", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                    else //Omaha, NE
                    {
                        drawalphanumericstring("OMAHA", 2, 64, 14, 7, 0, 0, 1, 0);
                        if (ModeSubstate > 3)
                        {
                            drawalphanumericstring("NEBRASKA", 2, 64, 24, 7, 0, 0, 1, 0);
                        }
                    }
                }
            }

            break;
        }
        case 5: //Track Frenzy
            if (HasItHappenedYet == 0)
            {
                HasItHappenedYet = 1;

                MathVariable = DataReceived[19] * 256;
                MathVariable += DataReceived[20];

                TotalEndOfBallBonus += DataReceived[17] * MathVariable;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            drawalphanumericstring("TRACK FRENZIES", 2, 64, 2, 7, 0, 0, 1, 0);

            if (CurrentProgramMillis > ModeSubstateMillis + 500)
            {
                ModeSubstate++;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            //This should progressively re-center each loop if it changes
            MultiStringWidth = 0;
            MultiStringWidth += DrawReallyBigNumber(DataReceived[17], 2, 0, 17, 7, 0, 0, 0, 1, 1, 1);
            MultiStringWidth += drawalphanumericcharacter(ASCII_SPACE, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += drawalphanumericcharacter(ASCII_SPACE, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += DrawReallyBigNumber(MathVariable, 2, 0, 17, 7, 0, 0, 0, 1, 1, 1);

            CursorX = 64 - (MultiStringWidth / 2);

            if (ModeSubstate == 0)
            {
                //Do nothing
            }
            else if (ModeSubstate == 1)
            {
                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
            }
            else if (ModeSubstate == 2)
            {
                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, CursorX, 17, 7, 0, 0, 0);
            }
            else if (ModeSubstate == 3)
            {
                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += DrawReallyBigNumber(MathVariable, 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
            }
            else
            {
                DrawReallyBigNumber(DataReceived[17] * MathVariable, 1, 64, 13, 7, 0, 0, 1, 1, 2, 0);
            }

            break;
        case 6: //Trestle
            if (HasItHappenedYet == 0)
            {
                HasItHappenedYet = 1;

                MathVariable = DataReceived[19] * 256;
                MathVariable += DataReceived[20];

                TotalEndOfBallBonus += DataReceived[17] * MathVariable;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            drawalphanumericstring("TRESTLES BUILT", 2, 64, 2, 7, 0, 0, 1, 0);

            if (CurrentProgramMillis > ModeSubstateMillis + 500)
            {
                ModeSubstate++;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            //This should progressively re-center each loop if it changes
            MultiStringWidth = 0;
            MultiStringWidth += DrawReallyBigNumber(DataReceived[17], 2, 0, 17, 7, 0, 0, 0, 1, 1, 1);
            MultiStringWidth += drawalphanumericcharacter(ASCII_SPACE, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += drawalphanumericcharacter(ASCII_SPACE, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += DrawReallyBigNumber(MathVariable, 2, 0, 17, 7, 0, 0, 0, 1, 1, 1);

            CursorX = 64 - (MultiStringWidth / 2);

            if (ModeSubstate == 0)
            {
                //Do nothing
            }
            else if (ModeSubstate == 1)
            {
                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
            }
            else if (ModeSubstate == 2)
            {
                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, CursorX, 17, 7, 0, 0, 0);
            }
            else if (ModeSubstate == 3)
            {
                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += DrawReallyBigNumber(MathVariable, 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
            }
            else
            {
                DrawReallyBigNumber(DataReceived[17] * MathVariable, 1, 64, 13, 7, 0, 0, 1, 1, 2, 0);
            }

            break;
        case 7: //Tunnel
            if (HasItHappenedYet == 0)
            {
                HasItHappenedYet = 1;

                MathVariable = DataReceived[19] * 256;
                MathVariable += DataReceived[20];

                TotalEndOfBallBonus += DataReceived[17] * MathVariable;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            drawalphanumericstring("TUNNELS BLASTED", 2, 64, 2, 7, 0, 0, 1, 0);

            if (CurrentProgramMillis > ModeSubstateMillis + 500)
            {
                ModeSubstate++;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            //This should progressively re-center each loop if it changes
            MultiStringWidth = 0;
            MultiStringWidth += DrawReallyBigNumber(DataReceived[17], 2, 0, 17, 7, 0, 0, 0, 1, 1, 1);
            MultiStringWidth += drawalphanumericcharacter(ASCII_SPACE, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += drawalphanumericcharacter(ASCII_SPACE, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += DrawReallyBigNumber(MathVariable, 2, 0, 17, 7, 0, 0, 0, 1, 1, 1);

            CursorX = 64 - (MultiStringWidth / 2);

            if (ModeSubstate == 0)
            {
                //Do nothing
            }
            else if (ModeSubstate == 1)
            {
                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
            }
            else if (ModeSubstate == 2)
            {
                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, CursorX, 17, 7, 0, 0, 0);
            }
            else if (ModeSubstate == 3)
            {
                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += DrawReallyBigNumber(MathVariable, 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
            }
            else
            {
                DrawReallyBigNumber(DataReceived[17] * MathVariable, 1, 64, 13, 7, 0, 0, 1, 1, 2, 0);
            }

            break;
        case 8: //Locomotive
            if (HasItHappenedYet == 0)
            {
                HasItHappenedYet = 1;

                MathVariable = DataReceived[19] * 256;
                MathVariable += DataReceived[20];

                TotalEndOfBallBonus += DataReceived[17] * MathVariable;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            drawalphanumericstring("LOCOMOTIVES ACQUIRED", 2, 64, 2, 7, 0, 0, 1, 0);

            if (CurrentProgramMillis > ModeSubstateMillis + 500)
            {
                ModeSubstate++;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            //This should progressively re-center each loop if it changes
            MultiStringWidth = 0;
            MultiStringWidth += DrawReallyBigNumber(DataReceived[17], 2, 0, 17, 7, 0, 0, 0, 1, 1, 1);
            MultiStringWidth += drawalphanumericcharacter(ASCII_SPACE, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += drawalphanumericcharacter(ASCII_SPACE, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += DrawReallyBigNumber(MathVariable, 2, 0, 17, 7, 0, 0, 0, 1, 1, 1);

            CursorX = 64 - (MultiStringWidth / 2);

            if (ModeSubstate == 0)
            {
                //Do nothing
            }
            else if (ModeSubstate == 1)
            {
                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
            }
            else if (ModeSubstate == 2)
            {
                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, CursorX, 17, 7, 0, 0, 0);
            }
            else if (ModeSubstate == 3)
            {
                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += DrawReallyBigNumber(MathVariable, 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
            }
            else
            {
                DrawReallyBigNumber(DataReceived[17] * MathVariable, 1, 64, 13, 7, 0, 0, 1, 1, 2, 0);
            }

            break;
        case 9: //INDIAN squabble
            if (HasItHappenedYet == 0)
            {
                HasItHappenedYet = 1;

                MathVariable = DataReceived[19] * 256;
                MathVariable += DataReceived[20];

                TotalEndOfBallBonus += DataReceived[17] * MathVariable;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            drawalphanumericstring("INDIAN SQUABBLES", 2, 64, 2, 7, 0, 0, 1, 0);

            if (CurrentProgramMillis > ModeSubstateMillis + 500)
            {
                ModeSubstate++;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            //This should progressively re-center each loop if it changes
            MultiStringWidth = 0;
            MultiStringWidth += DrawReallyBigNumber(DataReceived[17], 2, 0, 17, 7, 0, 0, 0, 1, 1, 1);
            MultiStringWidth += drawalphanumericcharacter(ASCII_SPACE, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += drawalphanumericcharacter(ASCII_SPACE, 2, 0, 17, 7, 0, 0, 1);
            MultiStringWidth += 1;
            MultiStringWidth += DrawReallyBigNumber(MathVariable, 2, 0, 17, 7, 0, 0, 0, 1, 1, 1);

            CursorX = 64 - (MultiStringWidth / 2);

            if (ModeSubstate == 0)
            {
                //Do nothing
            }
            else if (ModeSubstate == 1)
            {
                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
            }
            else if (ModeSubstate == 2)
            {
                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, CursorX, 17, 7, 0, 0, 0);
            }
            else if (ModeSubstate == 3)
            {
                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += drawalphanumericcharacter(ASCII_UPPERCASE_X, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += drawalphanumericcharacter(ASCII_SPACE, 2, CursorX, 17, 7, 0, 0, 0);
                CursorX += 1;
                CursorX += DrawReallyBigNumber(MathVariable, 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
            }
            else
            {
                DrawReallyBigNumber(DataReceived[17] * MathVariable, 1, 64, 13, 7, 0, 0, 1, 1, 2, 0);
            }

            break;
        case 10: //Total Bonus
            if (HasItHappenedYet == 0)
            {
                HasItHappenedYet = 1;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            drawalphanumericstring("TOTAL BONUS", 2, 64, 2, 7, 0, 0, 1, 0);

            if (CurrentProgramMillis > ModeSubstateMillis + 700)
            {
                ModeSubstate++;
                ModeSubstateMillis = CurrentProgramMillis;
            }

            if (ModeSubstate > 1)
            {
                DrawReallyBigNumber(TotalEndOfBallBonus, 1, 64, 15, 7, 0, 0, 1, 1, 2, 0);
            }
            
            break;
        }
    }
    else if (DataReceived[1] == 1 && DataReceived[15] == 3) //Supply Tower random reward
    {
        if (HasItHappenedYet == 0)
        {
            HasItHappenedYet = 1;
            ModeSubstateMillis = CurrentProgramMillis;
        }
        
        drawalphanumericstring("SUPPLY TOWER BONUS", 2, 64, 2, 7, 0, 0, 1, 0);
        
        if (CurrentProgramMillis > ModeSubstateMillis + 1000)
        {
            ModeSubstateMillis = CurrentProgramMillis;
            ModeSubstate++;
        }

        //Bonuses:
        //	x bonus points          
        //  x amount of bonus track
        //  Extra locomotive       
        //  Extra Trestle          
        //  Extra Tunnel           
        //  Track frenzy multiball 
        //  Extra ball             
        if (ModeSubstate > 0)
        {
            switch (DataReceived[16])
            {
            case 1: //Points
                SupplyTowerBonusPoints = DataReceived[18];
                SupplyTowerBonusPoints += DataReceived[17] * 256;

                MultiStringWidth = 0;
                MultiStringWidth += DrawReallyBigNumber(SupplyTowerBonusPoints, 2, 0, 17, 7, 0, 0, 0, 1, 1, 1);
                MultiStringWidth += drawalphanumericstring(" POINTS", 2, 0, 17, 7, 0, 0, 0, 1);

                CursorX = 64 - (MultiStringWidth / 2);

                CursorX += DrawReallyBigNumber(SupplyTowerBonusPoints, 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
                CursorX += drawalphanumericstring(" POINTS", 2, CursorX, 17, 7, 0, 0, 0, 0);
                break;
            case 2: //Track
                MultiStringWidth = 0;
                MultiStringWidth += DrawReallyBigNumber(DataReceived[17], 2, 0, 17, 7, 0, 0, 0, 1, 1, 1);
                MultiStringWidth += drawalphanumericstring(" MILES OF TRACK", 2, 0, 17, 7, 0, 0, 0, 1);

                CursorX = 64 - (MultiStringWidth / 2);

                CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 17, 7, 0, 0, 0, 1, 1, 0);
                CursorX += drawalphanumericstring(" MILES OF TRACK", 2, CursorX, 17, 7, 0, 0, 0, 0);

                break;
            case 3: //Locomotive
                drawalphanumericstring("EXTRA LOCOMOTIVE", 2, 64, 17, 7, 0, 0, 1, 0);
                break;
            case 4: //Trestle
                drawalphanumericstring("EXTRA TRESTLE", 2, 64, 17, 7, 0, 0, 1, 0);
                break;
            case 5: //Tunnel
                drawalphanumericstring("EXTRA TUNNEL", 2, 64, 17, 7, 0, 0, 1, 0);
                break;
            case 6: //Track Frenzy Multiball
                drawalphanumericstring("TRACK FRENZY", 2, 64, 14, 7, 0, 0, 1, 0);
                drawalphanumericstring("MULTIBALL", 2, 64, 24, 7, 0, 0, 1, 0);
                break;
            case 7: //Extra Ball
                drawalphanumericstring("EXTRA BALL", 2, 64, 17, 7, 0, 0, 1, 0);
                break;
            }
        }
    }
    else if (DataReceived[1] == 1 && DataReceived[15] == 4) //Track Frenzy Multiball Mode
    {
        if (TrackFrenzyHappenedYet == 0)
        {
            TrackFrenzyHappenedYet = 1;
            TrackFrenzyState = 0;
            TrackFrenzyMillis = CurrentProgramMillis;
        }

        if (TrackFrenzyState == 0 && CurrentProgramMillis > TrackFrenzyMillis + 3000)
        {
            TrackFrenzyState = 1;
            TrackFrenzyMillis = CurrentProgramMillis;
        }
        MathVariable = DataReceived[19];
        MathVariable += DataReceived[18] * 256;
        if (TrackFrenzyState == 1 && MathVariable >= DataReceived[17])
        {
            TrackFrenzyState = 2;
            TrackFrenzyMillis = CurrentProgramMillis;
        }
        if (TrackFrenzyState == 2 && CurrentProgramMillis > TrackFrenzyMillis + 2000)
        {
            TrackFrenzyState = 3;
            TrackFrenzyMillis = CurrentProgramMillis;
        }

        if (TrackFrenzyState == 0) //Tell player goal
        {
            drawalphanumericstring("TRACK FRENZY GOAL:", 2, 64, 2, 7, 0, 0, 1, 0);

            MultiStringWidth = 0;
            MultiStringWidth += drawalphanumericstring("BUILD ", 2, 0, 14, 7, 0, 0, 0, 1);
            MultiStringWidth += DrawReallyBigNumber(DataReceived[17], 2, 0, 14, 7, 0, 0, 0, 1, 2, 1); //Track Frenzy Miles Goal
            
            CursorX = 64 - (MultiStringWidth / 2);

            CursorX += drawalphanumericstring("BUILD ", 2, CursorX, 14, 7, 0, 0, 0, 0);
            CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 14, 7, 0, 0, 0, 1, 2, 0); //Track Frenzy Miles Goal

            drawalphanumericstring("MILES OF TRACK", 2, 64, 24, 7, 0, 0, 1, 0);
        }
        else if (TrackFrenzyState == 1) //Goal not completed, show progress
        {
            drawalphanumericstring("GOAL PROGRESS:", 2, 64, 2, 7, 0, 0, 1, 0);

            MultiStringWidth = 0;
            MultiStringWidth += DrawReallyBigNumber(MathVariable, 2, 0, 12, 7, 0, 0, 0, 1, 1, 1);
            MultiStringWidth += drawalphanumericstring(" / ", 2, 0, 12, 7, 0, 0, 0, 1);
            MultiStringWidth += DrawReallyBigNumber(DataReceived[17], 2, 0, 12, 7, 0, 0, 0, 1, 2, 1);
            MultiStringWidth += drawalphanumericstring(" MILES", 2, 0, 12, 7, 0, 0, 0, 1);

            CursorX = 64 - (MultiStringWidth / 2);

            CursorX += DrawReallyBigNumber(MathVariable, 2, CursorX, 12, 7, 0, 0, 0, 1, 1, 0);
            CursorX += drawalphanumericstring(" / ", 2, CursorX, 12, 7, 0, 0, 0, 0);
            CursorX += DrawReallyBigNumber(DataReceived[17], 2, CursorX, 12, 7, 0, 0, 0, 1, 2, 0);
            CursorX += drawalphanumericstring(" MILES", 2, CursorX, 12, 7, 0, 0, 0, 0);

            DrawReallyBigNumber(AssembledPlayerScore, 2, 127, 24, 7, 0, 0, 2, 1, 2, 0);
        }
        else if (TrackFrenzyState == 2) //Goal completed!
        {
            drawalphanumericstring("GOAL COMPLETED", 2, 64, 12, 7, 0, 0, 1, 0);
        }
        else if (TrackFrenzyState == 3) //How many extra miles of track?
        {
            drawalphanumericstring("EXTRA TRACK LAID:", 2, 64, 2, 7, 0, 0, 1, 0);

            MultiStringWidth = 0;
            MultiStringWidth += DrawReallyBigNumber(MathVariable - DataReceived[17], 2, 0, 12, 7, 0, 0, 0, 1, 1, 1);
            MultiStringWidth += drawalphanumericstring(" MILES", 2, 0, 12, 7, 0, 0, 0, 1);

            CursorX = 64 - (MultiStringWidth / 2);

            CursorX += DrawReallyBigNumber(MathVariable - DataReceived[17], 2, CursorX, 12, 7, 0, 0, 0, 1, 1, 0);
            CursorX += drawalphanumericstring(" MILES", 2, CursorX, 12, 7, 0, 0, 0, 0);
            
            DrawReallyBigNumber(AssembledPlayerScore, 2, 127, 24, 7, 0, 0, 2, 1, 2, 0);
        }
    }
    else if (DataReceived[1] == 1 && DataReceived[15] == 5) //Railroad completed multiball
    {
        if (HasItHappenedYet == 0)
        {
            HasItHappenedYet = 1;
            ModeSubstateMillis = CurrentProgramMillis;
        }

        if (CurrentProgramMillis > ModeSubstateMillis + 800)
        {
            ModeSubstate++;
            ModeSubstateMillis = CurrentProgramMillis;
        }
    
        if (DataReceived[17] == 1) //CPRR
        {
            if (ModeSubstate < 2)
            {
                drawalphanumericstring("CENTRAL PACIFIC", 2, 64, 7, 7, 0, 0, 1, 0);
                drawalphanumericstring("RAILROAD COMPLETED", 2, 64, 17, 7, 0, 0, 1, 0);
            }
            else if (ModeSubstate > 1)
            {
                drawalphanumericstring("BEGIN CONSTRUCTION", 2, 64, 2, 7, 0, 0, 1, 0);
                drawalphanumericstring("OF THE", 2, 64, 12, 7, 0, 0, 1, 0);
                drawalphanumericstring("UNION PACIFIC", 2, 64, 22, 7, 0, 0, 1, 0);
            }
        }
        else if (DataReceived[17] == 2) //UPRR
        {
            if (ModeSubstate < 2)
            {
                drawalphanumericstring("UNION PACIFIC", 2, 64, 7, 7, 0, 0, 1, 0);
                drawalphanumericstring("RAILROAD COMPLETED", 2, 64, 17, 7, 0, 0, 1, 0);
            }
            else if (ModeSubstate > 1)
            {
                drawalphanumericstring("BEGIN CONSTRUCTION", 2, 64, 2, 7, 0, 0, 1, 0);
                drawalphanumericstring("OF THE", 2, 64, 12, 7, 0, 0, 1, 0);
                drawalphanumericstring("CENTRAL PACIFIC", 2, 64, 22, 7, 0, 0, 1, 0);
            }
        }
    }
    else if (DataReceived[1] == 1 && DataReceived[15] == 6) //Tunnel being blasted
    {
        if (DataReceived[16] == 1) //Shoot again to blast a tunnel
        {
            drawalphanumericstring("SHOOT FLASHING TARGET", 2, 64, 7, 7, 0, 0, 1, 0);
            drawalphanumericstring("TO BLAST A TUNNEL", 2, 64, 17, 7, 0, 0, 1, 0);
        }
        else if (DataReceived[16] == 2) //A tunnel has been blasted!
        {
            drawalphanumericstring("A TUNNEL HAS", 2, 64, 7, 7, 0, 0, 1, 0);
            drawalphanumericstring("BEEN BLASTED", 2, 64, 17, 7, 0, 0, 1, 0);
        }
        else if (DataReceived[16] == 3) //You need to blast x more tunnels
        {
            if (DataReceived[17] == 1)  //Singular Tunnel
            {
                drawalphanumericstring("YOU NEED TO BLAST", 2, 64, 2, 7, 0, 0, 1, 0);
                DrawReallyBigNumber(DataReceived[17], 2, 64, 12, 7, 0, 0, 1, 1, 1, 0);
                drawalphanumericstring("MORE TUNNEL", 2, 64, 22, 7, 0, 0, 1, 0);
            }
            else if (DataReceived[17] > 1) //Plural Tunnels
            {
                drawalphanumericstring("YOU NEED TO BLAST", 2, 64, 2, 7, 0, 0, 1, 0);
                DrawReallyBigNumber(DataReceived[17], 2, 64, 12, 7, 0, 0, 1, 1, 1, 0);
                drawalphanumericstring("MORE TUNNELS", 2, 64, 22, 7, 0, 0, 1, 0);
            }
        }
    }
    else if (DataReceived[1] == 1 && DataReceived[15] == 7) //Trestle building stuff
    {
        if (DataReceived[16] == 1) //Shoot flashing lane
        {
            drawalphanumericstring("SHOOT FLASHING LANE", 2, 64, 2, 7, 0, 0, 1, 0);
            drawalphanumericstring("TO BEGIN TRESTLE", 2, 64, 12, 7, 0, 0, 1, 0);
            drawalphanumericstring("CONSTRUCTION", 2, 64, 22, 7, 0, 0, 1, 0);
        }
        else if (DataReceived[16] == 2) //Shoot flashing lane to build a trestle
        {
            drawalphanumericstring("SHOOT FLASHING LANE", 2, 64, 7, 7, 0, 0, 1, 0);
            drawalphanumericstring("TO FINISH THE TRESTLE", 2, 64, 17, 7, 0, 0, 1, 0);
        }
        else if (DataReceived[16] == 3) //Trestle built
        {
            drawalphanumericstring("THE TRESTLE", 2, 64, 7, 7, 0, 0, 1, 0);
            drawalphanumericstring("HAS BEEN BUILT", 2, 64, 17, 7, 0, 0, 1, 0);
        }
        else if (DataReceived[16] == 4) //You need to build x more trestles
        {
            if (DataReceived[17] == 1)  //Singular Trestle
            {
                drawalphanumericstring("YOU NEED TO BUILD", 2, 64, 2, 7, 0, 0, 1, 0);
                DrawReallyBigNumber(DataReceived[17], 2, 64, 12, 7, 0, 0, 1, 1, 1, 0);
                drawalphanumericstring("MORE TRESTLE", 2, 64, 22, 7, 0, 0, 1, 0);
            }
            else if (DataReceived[17] > 1) //Plural Trestles
            {
                drawalphanumericstring("YOU NEED TO BUILD", 2, 64, 2, 7, 0, 0, 1, 0);
                DrawReallyBigNumber(DataReceived[17], 2, 64, 12, 7, 0, 0, 1, 1, 1, 0);
                drawalphanumericstring("MORE TRESTLES", 2, 64, 22, 7, 0, 0, 1, 0);
            }
        }
    }
    else if (DataReceived[1] == 1 && DataReceived[15] == 8) //Miles of track based on pop bumpers
    {
        TotalMilesOfTrack = DataReceived[18];
        TotalMilesOfTrack += DataReceived[17] * 256;
    
        RailroadTrackGoal = DataReceived[20];
        RailroadTrackGoal += DataReceived[19] * 256;

        //Track Laid
        //X / XXXX Miles
        //Score at bottom right
        drawalphanumericstring("TRACK LAID:", 2, 64, 2, 7, 0, 0, 1, 0);

        MultiStringWidth = 0;
        MultiStringWidth += DrawReallyBigNumber(TotalMilesOfTrack, 2, 0, 12, 7, 0, 0, 0, 1, 1, 1);
        MultiStringWidth += drawalphanumericstring(" / ", 2, 0, 12, 7, 0, 0, 0, 1);
        MultiStringWidth += DrawReallyBigNumber(RailroadTrackGoal, 2, 0, 12, 7, 0, 0, 0, 1, 1, 1);
        MultiStringWidth += drawalphanumericstring(" MILES", 2, 0, 12, 7, 0, 0, 0, 1);

        CursorX = 64 - (MultiStringWidth / 2);

        CursorX += DrawReallyBigNumber(TotalMilesOfTrack, 2, CursorX, 12, 7, 0, 0, 0, 1, 1, 0);
        CursorX += drawalphanumericstring(" / ", 2, CursorX, 12, 7, 0, 0, 0, 0);
        CursorX += DrawReallyBigNumber(RailroadTrackGoal, 2, CursorX, 12, 7, 0, 0, 0, 1, 1, 0);
        CursorX += drawalphanumericstring(" MILES", 2, CursorX, 12, 7, 0, 0, 0, 0);

        DrawReallyBigNumber(AssembledPlayerScore, 2, 127, 24, 7, 0, 0, 2, 1, 2, 0);
    }
    else if (DataReceived[1] == 1 && DataReceived[15] == 9) //INDIANS multiball
    {   
        if (INDIANSModeHappenedYet == 0)
        {
            INDIANSModeHappenedYet = 1;
            INDIANSModeFlashState = 7;
            INDIANSModeMillis = CurrentProgramMillis;
        }

        if (CurrentProgramMillis > INDIANSModeMillis + 500)
        {
            INDIANSModeMillis = CurrentProgramMillis;
            if (INDIANSModeFlashState == 1)
            {
                INDIANSModeFlashState = 0;
            }
            else
            {
                INDIANSModeFlashState = 1;
            }
        }

        switch (DataReceived[16])
        {
        case 1:
            //THE INDIANS ARE ATTACKING
            drawalphanumericstring("THE INDIANS", 2, 64, 7, 7, 0, 0, 1, 0);
            drawalphanumericstring("ARE ATTACKING", 2, 64, 17, 7, 0, 0, 1, 0);
            break;
        case 2:
            //SHOOT FLASHING TARGETS TO SPELL "INDIANS"
            drawalphanumericstring("SHOOT FLASHING", 2, 64, 2, 7, 0, 0, 1, 0);
            drawalphanumericstring("TARGETS TO SPELL", 2, 64, 12, 7, 0, 0, 1, 0);
            drawalphanumericstring("I-N-D-I-A-N-S", 2, 64, 22, 7, 0, 0, 1, 0);
            break;
        case 3:
            //I-N-D-I-A-N-S


            MathVariable = DataReceived[17];
            if (MathVariable > 63)
            {
                MathVariable -= 64;
                drawalphanumericcharacter(ASCII_UPPERCASE_I, 1, 25, 4, 7, 0, 0, 0);
            }
            else
            {
                drawalphanumericcharacter(ASCII_UPPERCASE_I, 1, 25, 4, INDIANSModeFlashState+1, 0, 0, 0);
            }

            if (MathVariable > 31)
            {
                MathVariable -= 32;
                drawalphanumericcharacter(ASCII_UPPERCASE_N, 1, 36, 4, 7, 0, 0, 0);
            }
            else
            {
                drawalphanumericcharacter(ASCII_UPPERCASE_N, 1, 36, 4, INDIANSModeFlashState + 1, 0, 0, 0);
            }

            if (MathVariable > 15)
            {
                MathVariable -= 16;
                drawalphanumericcharacter(ASCII_UPPERCASE_D, 1, 47, 4, 7, 0, 0, 0);
            }
            else
            {
                drawalphanumericcharacter(ASCII_UPPERCASE_D, 1, 47, 4, INDIANSModeFlashState + 1, 0, 0, 0);
            }

            if (MathVariable > 7)
            {
                MathVariable -= 8;
                drawalphanumericcharacter(ASCII_UPPERCASE_I, 1, 58, 4, 7, 0, 0, 0);
            }
            else
            {
                drawalphanumericcharacter(ASCII_UPPERCASE_I, 1, 58, 4, INDIANSModeFlashState + 1, 0, 0, 0);
            }

            if (MathVariable > 3)
            {
                MathVariable -= 4;
                drawalphanumericcharacter(ASCII_UPPERCASE_A, 1, 69, 4, 7, 0, 0, 0);
            }
            else
            {
                drawalphanumericcharacter(ASCII_UPPERCASE_A, 1, 69, 4, INDIANSModeFlashState + 1, 0, 0, 0);
            }

            if (MathVariable > 1)
            {
                MathVariable -= 2;
                drawalphanumericcharacter(ASCII_UPPERCASE_N, 1, 80, 4, 7, 0, 0, 0);
            }
            else
            {
                drawalphanumericcharacter(ASCII_UPPERCASE_N, 1, 80, 4, INDIANSModeFlashState + 1, 0, 0, 0);
            }

            if (MathVariable > 0)
            {
                MathVariable -= 1;
                drawalphanumericcharacter(ASCII_UPPERCASE_S, 1, 91, 4, 7, 0, 0, 0);
            }
            else
            {
                drawalphanumericcharacter(ASCII_UPPERCASE_S, 1, 91, 4, INDIANSModeFlashState + 1, 0, 0, 0);
            }

            DrawReallyBigNumber(AssembledPlayerScore, 2, 127, 24, 7, 0, 0, 2, 1, 2, 0);
            break;
        case 4:
            //WAVE OF INDIANS REPELLED
            drawalphanumericstring("A WAVE OF INDIANS", 2, 64, 7, 7, 0, 0, 1, 0);
            drawalphanumericstring("HAS BEEN REPELLED", 2, 64, 17, 7, 0, 0, 1, 0);
            break;
        case 5:
            //INDIANS DEFEATED
            drawalphanumericstring("THE INDIAN ATTACKERS", 2, 64, 7, 7, 0, 0, 1, 0);
            drawalphanumericstring("HAVE BEEN DEFEATED", 2, 64, 17, 7, 0, 0, 1, 0);
            break;
        case 6:
            //The Indians killed the track crews
            drawalphanumericstring("THE INDIANS KILLED", 2, 64, 7, 7, 0, 0, 1, 0);
            drawalphanumericstring("THE TRACK CREWS", 2, 64, 17, 7, 0, 0, 1, 0);
            break;
        }
    }
    else if (DataReceived[1] == 1 && DataReceived[15] == 10) //Ball saved
    {
        drawalphanumericstring("BALL SAVED", 1, 64, 8, 7, 0, 0, 1, 0);
    }
    else if (DataReceived[1] == 1 && DataReceived[15] == 11) //Extra Ball Available
    {
        drawalphanumericstring("EXTRA BALL AVAILABLE", 2, 64, 2, 7, 0, 0, 1, 0);
        drawalphanumericstring("SHOOT THE", 2, 64, 12, 7, 0, 0, 1, 0);
        drawalphanumericstring("SUPPLY TOWER", 2, 64, 22, 7, 0, 0, 1, 0);
    }
    else if (DataReceived[1] == 1 && DataReceived[15] == 12) //Match
    {
        if (HasItHappenedYet == 0)
        {
            HasItHappenedYet = 1;
        }
        
        if (DataReceived[16] == 1) //MATCH
        {
            drawalphanumericstring("MATCH", 1, 64, 8, 7, 0, 0, 1, 0);
        }
        else if (DataReceived[16] == 2) //Match this number
        {
            drawalphanumericstring("MATCH", 2, 64, 2, 7, 0, 0, 1, 0);
            DrawReallyBigNumber(DataReceived[17], 2, 64, 12, 7, 0, 0, 1, 0, 2, 0);
        }
        else if (DataReceived[16] == 3) //Random numbers
        {
            drawalphanumericstring("MATCH", 2, 64, 2, 7, 0, 0, 1, 0);
            DrawReallyBigNumber(DataReceived[17], 2, 64, 12, 7, 0, 0, 1, 0, 2, 0);
            DrawReallyBigNumber(random(0, 100), 2, 64, 22, 7, 0, 0, 1, 0, 2, 0);
        }
        else if (DataReceived[16] == 4) //Showing the match
        {
            drawalphanumericstring("MATCH", 2, 64, 2, 7, 0, 0, 1, 0);
            DrawReallyBigNumber(DataReceived[17], 2, 64, 12, 7, 0, 0, 1, 0, 2, 0);
            DrawReallyBigNumber(DataReceived[18], 2, 64, 22, 7, 0, 0, 1, 0, 2, 0);
        }
        else if (DataReceived[16] == 5) //You won the match
        {
            if (DataReceived[19] == 0) //Extra Ball
            {
                drawalphanumericstring("MATCH WON", 2, 64, 7, 7, 0, 0, 1, 0);
                drawalphanumericstring("EXTRA BALL AWARDED", 2, 64, 17, 7, 0, 0, 1, 0);
            }
            else if(DataReceived[19] == 1)//Free game
            {
                drawalphanumericstring("MATCH WON", 2, 64, 7, 7, 0, 0, 1, 0);
                drawalphanumericstring("FREE GAME AWARDED", 2, 64, 17, 7, 0, 0, 1, 0);
            }
            else
            {
                drawalphanumericstring("NO MATCH", 2, 64, 7, 7, 0, 0, 1, 0);
                drawalphanumericstring("GAME OVER", 2, 64, 17, 7, 0, 0, 1, 0);
            }
        }
    }
    else if (DataReceived[1] == 1 && DataReceived[15] == 13) //High score mode
    {
        if (DataReceived[16] == 1) //Player 1 achieved High Score #
        {
            highscorerank = DataReceived[17];
            
            if (HasItHappenedYet == 0)
            {
                HasItHappenedYet = 1;

                //Move scores down
                if (highscorerank <= 8)
                {
                    for (byte x = 0; x < 15; x++)
                    {
                        HighScoreArray[8][x] = HighScoreArray[7][x];
                    }
                }
                if (highscorerank <= 7)
                {
                    for (byte x = 0; x < 15; x++)
                    {
                        HighScoreArray[7][x] = HighScoreArray[6][x];
                    }
                }
                if (highscorerank <= 6)
                {
                    for (byte x = 0; x < 15; x++)
                    {
                        HighScoreArray[6][x] = HighScoreArray[5][x];
                    }
                }
                if (highscorerank <= 5)
                {
                    for (byte x = 0; x < 15; x++)
                    {
                        HighScoreArray[5][x] = HighScoreArray[4][x];
                    }
                }
                if (highscorerank <= 4)
                {
                    for (byte x = 0; x < 15; x++)
                    {
                        HighScoreArray[4][x] = HighScoreArray[3][x];
                    }
                }
                if (highscorerank <= 3)
                {
                    for (byte x = 0; x < 15; x++)
                    {
                        HighScoreArray[3][x] = HighScoreArray[2][x];
                    }
                }
                if (highscorerank <= 2)
                {
                    for (byte x = 0; x < 15; x++)
                    {
                        HighScoreArray[2][x] = HighScoreArray[1][x];
                    }
                }
                if (highscorerank == 1)
                {
                    for (byte x = 0; x < 15; x++)
                    {
                        HighScoreArray[1][x] = HighScoreArray[0][x];
                    }
                }

                //Write score data in
                HighScoreArray[highscorerank - 1][0] = ASCII_UNDERSCORE;
                HighScoreArray[highscorerank - 1][1] = ASCII_UNDERSCORE;
                HighScoreArray[highscorerank - 1][2] = ASCII_UNDERSCORE;
                HighScoreArray[highscorerank - 1][3] = ASCII_UNDERSCORE;
                HighScoreArray[highscorerank - 1][4] = ASCII_UNDERSCORE;

                HighScoreArray[highscorerank - 1][5] = DataReceived[2];
                HighScoreArray[highscorerank - 1][6] = DataReceived[3];
                HighScoreArray[highscorerank - 1][7] = DataReceived[4];
                HighScoreArray[highscorerank - 1][8] = DataReceived[5];
                HighScoreArray[highscorerank - 1][9] = DataReceived[6];
                HighScoreArray[highscorerank - 1][10] = DataReceived[7];
                HighScoreArray[highscorerank - 1][11] = DataReceived[8];
                HighScoreArray[highscorerank - 1][12] = DataReceived[9];
                HighScoreArray[highscorerank - 1][13] = DataReceived[10];
                HighScoreArray[highscorerank - 1][14] = DataReceived[11];
            }

            drawalphanumericstring("PLAYER 1 ACHIEVED", 2, 64, 7, 7, 0, 0, 1, 0);

            drawalphanumericstring("HIGH SCORE #", 2, 25, 17, 7, 0, 0, 0, 0);
            DrawReallyBigNumber(highscorerank, 2, 97, 17, 7, 0, 0, 0, 0, 1, 0);
        }
        else if (DataReceived[16] == 2) //Enter your intitials
        {
            drawalphanumericstring("PLEASE ENTER UP TO", 2, 64, 2, 7, 0, 0, 1, 0);
            drawalphanumericstring("5 CHARACTERS FOR THE", 2, 64, 12, 7, 0, 0, 1, 0);
            drawalphanumericstring("HIGH SCORE TABLE", 2, 64, 22, 7, 0, 0, 1, 0);
        }
        else if (DataReceived[16] == 3) //Flippers scroll through characters, the start button selects the character.
        {
            drawalphanumericstring("THE FLIPPER BUTTONS", 2, 64, 2, 7, 0, 0, 1, 0);
            drawalphanumericstring("SCROLL AND THE", 2, 64, 12, 7, 0, 0, 1, 0);
            drawalphanumericstring("START BUTTON CHOOSES", 2, 64, 22, 7, 0, 0, 1, 0);
        }
        else if (DataReceived[16] == 4) //Show characters as the High Score is being entered, time left?
        {
            if (HighScoreHappenedYet == 0)
            {
                HighScoreHappenedYet = 1;
                HighScoreFlashState = 7;
                HighScoreFlashMillis = CurrentProgramMillis;
            }
            
            if (HighScoreFlashMillis > ModeSubstateMillis + 700)
            {
                if (HighScoreFlashState == 7)
                {
                    HighScoreFlashState = 1;
                }
                else
                {
                    HighScoreFlashState = 7;
                }
                HighScoreFlashMillis = CurrentProgramMillis;
            }

            DrawReallyBigNumber(DataReceived[17], 2, 125, 3, 7, 0, 0, 2, 0, 1, 0);

            if (DataReceived[20] != 0)
            {
                HighScoreArray[highscorerank - 1][DataReceived[18]] = DataReceived[20];
            }
            else
            {
                HighScoreArray[highscorerank - 1][DataReceived[18]] = DataReceived[19];
            }

            for (byte x = DataReceived[18] + 1; x < 5; x++)
            {
                HighScoreArray[highscorerank - 1][x] = ASCII_UNDERSCORE;
            }

            if (DataReceived[18] == 0)
            {
                drawalphanumericcharacter(HighScoreArray[highscorerank - 1][0], 1, 37, 4, HighScoreFlashState, 0, 0, 0);
            }
            else
            {
                drawalphanumericcharacter(HighScoreArray[highscorerank - 1][0], 1, 37, 4, 1, 0, 0, 0);
            }

            if (DataReceived[18] == 1)
            {
                drawalphanumericcharacter(HighScoreArray[highscorerank - 1][1], 1, 48, 4, HighScoreFlashState, 0, 0, 0);
            }
            else
            {
                drawalphanumericcharacter(HighScoreArray[highscorerank - 1][1], 1, 48, 4, 1, 0, 0, 0);
            }

            if (DataReceived[18] == 2)
            {
                drawalphanumericcharacter(HighScoreArray[highscorerank - 1][2], 1, 59, 4, HighScoreFlashState, 0, 0, 0);
            }
            else
            {
                drawalphanumericcharacter(HighScoreArray[highscorerank - 1][2], 1, 59, 4, 1, 0, 0, 0);
            }

            if (DataReceived[18] == 3)
            {
                drawalphanumericcharacter(HighScoreArray[highscorerank - 1][3], 1, 70, 4, HighScoreFlashState, 0, 0, 0);
            }
            else
            {
                drawalphanumericcharacter(HighScoreArray[highscorerank - 1][3], 1, 70, 4, 1, 0, 0, 0);
            }

            if (DataReceived[18] == 4)
            {
                drawalphanumericcharacter(HighScoreArray[highscorerank - 1][4], 1, 81, 4, HighScoreFlashState, 0, 0, 0);
            }
            else
            {
                drawalphanumericcharacter(HighScoreArray[highscorerank - 1][4], 1, 81, 4, 1, 0, 0, 0);
            }

            AmpersandSkippedYet = 0;

            drawsmallscrollingletter(49, 24, DataReceived[19] - 1, 1, 1);
            drawsmallscrollingletter(43, 24, DataReceived[19] - 2, 1, 1);
            drawsmallscrollingletter(37, 24, DataReceived[19] - 3, 1, 1);
            drawsmallscrollingletter(31, 24, DataReceived[19] - 4, 1, 1);
            drawsmallscrollingletter(25, 24, DataReceived[19] - 5, 1, 1);
            drawsmallscrollingletter(19, 24, DataReceived[19] - 6, 1, 1);
            drawsmallscrollingletter(13, 24, DataReceived[19] - 7, 1, 1);
            drawsmallscrollingletter(7, 24, DataReceived[19] - 8, 1, 1);
            drawsmallscrollingletter(1, 24, DataReceived[19] - 9, 1, 1);

            AmpersandSkippedYet = 0;

            drawsmallscrollingletter(61, 24, DataReceived[19], 7, 2);

            drawsmallscrollingletter(73, 24, DataReceived[19] + 1, 1, 2);
            drawsmallscrollingletter(79, 24, DataReceived[19] + 2, 1, 2);
            drawsmallscrollingletter(85, 24, DataReceived[19] + 3, 1, 2);
            drawsmallscrollingletter(91, 24, DataReceived[19] + 4, 1, 2);
            drawsmallscrollingletter(97, 24, DataReceived[19] + 5, 1, 2);
            drawsmallscrollingletter(103, 24, DataReceived[19] + 6, 1, 2);
            drawsmallscrollingletter(109, 24, DataReceived[19] + 7, 1, 2);
            drawsmallscrollingletter(115, 24, DataReceived[19] + 8, 1, 2);
            drawsmallscrollingletter(121, 24, DataReceived[19] + 9, 1, 2);
        }
        else if (DataReceived[16] == 5) //Show Player's entry, score, and high score rank. (Also enter it into the DMD's memory)
        {
            //Make the highscorenumber thing flash
            drawsmallhighscorenumber(1, 6, highscorerank, 7);
            if (DataReceived[17] == 1)
            {
                drawsmallrewardblankcredits(14, 20, 1, 7);
            }
            else
            {
                drawalphanumericstring("CONGRATULATIONS!", 2, 64, 20, 7, 0, 0, 1, 0);
            }
        }
    }
    else if (DataReceived[1] == 1) //Game mode
    {
        //Just draw the score
        DrawReallyBigNumber(AssembledPlayerScore, 1, 64, 4, 7, 0, 0, 1, 1, 2, 0);
        drawcurrentball(14, 24, 7);
        drawplayernumber(72, 24, 1, 7);

        TrackFrenzyHappenedYet = 0;
        INDIANSModeHappenedYet = 0;
        HighScoreHappenedYet = 0;
    }
    //All of the old stuff begins here
    /*if (mode == 0) //Attract Mode
    {
        if (image == 0)
        {
            //Show GOLDEN SPIKE image
            //(c) Kincaid Arcade 2019
            drawalphanumericcharacter(ASCII_COPYRIGHT, 2, 0, 24, 1, 0, 0, 0);
            drawalphanumericstring(" KINCAID ARCADE 2019", 2, 9, 24, 1, 0, 0, 0);
        }
        else if (image == 1)
        {
            //Show High Scores
            drawalphanumericstring("HIGH SCORES:", 2, 64, 2, 1, 0, 0, 1);
            drawsmallhighscorenumber(1, 14, mpvariable);
            drawsmallhighscorenumber(1, 24, mpvariable + 1);
        }
        else if (image == 2)
        {
            //Show previous game score
            drawlargescoretomasterbuffer(4);
            drawplayernumber(8, 24, 1);
            drawalphanumericstring("GAME OVER", 2, 96, 24, 1, 0, 0, 1);
        }


        else if (image == 3)
        {
            //If credits are present...
            drawcreditnumber(67, 24);
            drawalphanumericstring("GAME OVER", 2, 32, 24, 1, 0, 0, 1);
        }
        else if (image == 4)
        {
            //If sufficient credits are present to start a game...
            drawalphanumericstring("START GAME", 1, 64, 4, 1, 0, 0, 1);

            drawcreditnumber(67, 24);
            drawalphanumericstring("GAME OVER", 2, 32, 24, 1, 0, 0, 1);
        }
    }
    else if (mode == 1) //Game
    {
        drawlargescoretomasterbuffer(4);
        drawcurrentball(14, 24);
        drawplayernumber(72, 24, 1);
    }
    else if (mode == 2) //INDIANS!!!
    {
        drawsmallscore(59, 24);
    }

    else if (mode == 8) //Ball Saved
    {
        drawalphanumericstring("BALL SAVED", 1, 64, 8, 1, 0, 0, 1);
    }
    else if (mode == 10) //Tilt
    {
        drawalphanumericstring("TILTED", 1, 64, 8, 1, 0, 0, 1);
    }
    else if (mode == 11) //High Score
    {
        //Need to add a 'GRAND CHAMPION' phase
        if (image == 0)
        {
            highscorerank = mpvariable;
            //Do all the shifting of scores.
            bumpdownhighscoredata(highscorerank);
            for (int x = 0; x < 10; x++)
            {
                highscorearray[highscorerank - 1][x + 5] = DataReceived[x+2];
            }
            for (int x = 0; x < 5; x++)
            {
                highscorearray[highscorerank - 1][x] = 95;
            }

            //PLAYER 1
            //HIGH SCORE ###
            drawplayernumber(40, 6, 1);
            drawsmallhighscorerank(25, 20, highscorerank);
        }
        if (image == 1)
        {
            //ENTER INITIALS
            drawalphanumericstring("ENTER INITIALS", 2, 64, 12, 1, 0, 0, 1);
        }
        if (image == 2)
        {
            //FLIPPERS SCROLL
            //START CHOOSES LETTER
            drawalphanumericstring("FLIPPERS SCROLL", 2, 64, 6, 1, 0, 0, 1);
            drawalphanumericstring("START CHOOSES LETTER", 2, 64, 20, 1, 0, 0, 1);
        }
        if (image == 3)
        {
            if (mpvariabletwo != lastmpvariabletwo && mpvariable != 91)
            {
                highscorearray[highscorerank - 1][mpvariabletwo - 1] = mpvariable;
            }
            if (mpvariabletwo != lastmpvariabletwo && mpvariable == 91)
            {
                highscorearray[highscorerank - 1][mpvariabletwo] = 95;
            }
            //Enter Initials Screen
            //Large 5 initials up top, row of characters down below
            drawalphanumericcharacter(highscorearray[highscorerank - 1][0], 1, 37, 4, 1, 0, 0, 0);
            drawalphanumericcharacter(highscorearray[highscorerank - 1][1], 1, 48, 4, 1, 0, 0, 0);
            drawalphanumericcharacter(highscorearray[highscorerank - 1][2], 1, 59, 4, 1, 0, 0, 0);
            drawalphanumericcharacter(highscorearray[highscorerank - 1][3], 1, 70, 4, 1, 0, 0, 0);
            drawalphanumericcharacter(highscorearray[highscorerank - 1][4], 1, 81, 4, 1, 0, 0, 0);

            drawsmallscrollingletter(1, 24, mpvariable - 9);
            drawsmallscrollingletter(7, 24, mpvariable - 8);
            drawsmallscrollingletter(13, 24, mpvariable - 7);
            drawsmallscrollingletter(19, 24, mpvariable - 6);
            drawsmallscrollingletter(25, 24, mpvariable - 5);
            drawsmallscrollingletter(31, 24, mpvariable - 4);
            drawsmallscrollingletter(37, 24, mpvariable - 3);
            drawsmallscrollingletter(43, 24, mpvariable - 2);
            drawsmallscrollingletter(49, 24, mpvariable - 1);

            drawsmallscrollingletter(61, 24, mpvariable); //Need to draw a box around this one.

            drawsmallscrollingletter(73, 24, mpvariable + 1);
            drawsmallscrollingletter(79, 24, mpvariable + 2);
            drawsmallscrollingletter(85, 24, mpvariable + 3);
            drawsmallscrollingletter(91, 24, mpvariable + 4);
            drawsmallscrollingletter(97, 24, mpvariable + 5);
            drawsmallscrollingletter(103, 24, mpvariable + 6);
            drawsmallscrollingletter(109, 24, mpvariable + 7);
            drawsmallscrollingletter(115, 24, mpvariable + 8);
            drawsmallscrollingletter(121, 24, mpvariable + 9);

            lastmpvariabletwo = mpvariabletwo;
            lastmpvariable = mpvariable;
        }
        if (image == 4)
        {
            //Show HS number, initials & score.
            //Reward: 1 credit
            drawsmallhighscorenumber(1, 6, highscorerank);
            drawsmallrewardblankcredits(14, 20, 1);
            //Write ALL high scores to the EEPROM or SD card.
        }
    }
    else if (mode == 12) //Game Over
    {
        drawalphanumericstring("GAME OVER", 1, 64, 8, 1, 0, 0, 1);
    }
    else if (mode == 13) //Match # for free game
    {
        if (mpvariable == 1)
        {
            drawlargematch(18, 4);
            drawplayernumber(8, 24, 1);
            drawsmallscore(59, 24);
        }
        if (mpvariable == 2)
        {
            drawalphanumericcharacter(mpvariabletwo + 48, 1, 53, 4, 1, 0, 0, 0);
            drawalphanumericcharacter(DataReceived[11] + 48, 1, 65, 4, 1, 0, 0, 0);

            drawplayernumber(8, 24, 1);
            drawsmallscore(59, 24);
        }
        if (mpvariable == 3)
        {
            //Display FREE GAME
            drawalphanumericstring("FREE GAME!", 1, 64, 8, 1, 0, 0, 1);
        }
        if (mpvariable == 4)
        {
            //You didn't get the match, or its time to pause and go back to attract mode.
            drawalphanumericcharacter(mpvariabletwo + 48, 1, 53, 4, 1, 0, 0, 0);
            drawalphanumericcharacter(DataReceived[11] + 48, 1, 65, 4, 1, 0, 0, 0);

            drawplayernumber(8, 24, 1);
            drawsmallscore(59, 24);
        }
    }*/
}

void bumpdownhighscoredata(int newhsrank)
{
    for (int y = 9; y > newhsrank - 1; y--)
    {
        for (int x = 0; x < 14; x++)
        {
            HighScoreArray[y][x] = HighScoreArray[y - 1][x];
        }
    }
}

//Figure it out later
byte drawsmallscrollingletter(int xshift, int yshift, int number, byte shade, byte SideOfCursor)
{
    //For figuring out numbers on the right
    if (SideOfCursor == 2)
    {
        if (AmpersandSkippedYet == 1)
        {
            number++;
        }
        
        if (number > 127)
        {
            number -= 96;
        }
        if (number > 47 && number < 58)
        {
            number += 10;
        }
        if (number == 64)
        {
            number++;
            AmpersandSkippedYet = 1;
        }
        if (number > 96 && number < 123)
        {
            number += 26;
        }

        if (number > 127)
        {
            number -= 96;
        }
    }

    //For figuring out numbers on the left
    if (SideOfCursor == 1)
    {
        if (AmpersandSkippedYet == 1)
        {
            number--;
        }

        if (number < 32)
        {
            number += 96;
        }
        if (number > 96 && number < 123)
        {
            number -= 26;
        }
        if (number == 64)
        {
            number--;
            AmpersandSkippedYet = 1;
        }
        if (number > 47 && number < 58)
        {
            number -= 10;
        }
    }
    

    if (number != 127)
    {
        drawalphanumericcharacter(number, 2, xshift, yshift, shade, 0, 0, 0);
    }
    else if (number == 127)
    {
        drawalphanumericcharacter(ASCII_DELETE, 2, xshift, yshift, shade, 0, 0, 0);
    }

    return number;
}

void drawcurrentball(int xshift, int yshift, byte shade)
{
    drawalphanumericstring("BALL", 2, xshift, yshift, shade, 0, 0, 0, 0);
    if (DataReceived[14] > 9)
    {
        MathVariable = 0;
        MathVariableTwo = DataReceived[14];
        while (MathVariableTwo >= 10)
        {
            MathVariableTwo -= 10;
            MathVariable++;
        }
        drawalphanumericcharacter(MathVariable + 48, 2, xshift + 30, yshift, shade, 0, 0, 0);
        drawalphanumericcharacter(MathVariableTwo + 48, 2, xshift + 36, yshift, shade, 0, 0, 0);
    }
    else
    {
        drawalphanumericcharacter(DataReceived[14] + 48, 2, xshift + 30, yshift, shade, 0, 0, 0);
    }

    //lastball = currentball; //Remove this?
}

void drawcreditnumber(int xshift, int yshift, byte shade)
{
    drawalphanumericstring("CREDITS:", 2, xshift, yshift, shade, 0, 0, 0, 0);
    if (DataReceived[12] != 0)
    {
        drawalphanumericcharacter(DataReceived[12] + 48, 2, xshift + 45, yshift, shade, 0, 0, 0);
    }
    drawalphanumericcharacter(DataReceived[13] + 48, 2, xshift + 51, yshift, shade, 0, 0, 0);
}

void drawsmallhighscorerank(int xshift, int yshift, int number)
{
    drawalphanumericstring("HIGH SCORE #", 2, xshift, yshift, 1, 0, 0, 0, 0);
    drawalphanumericcharacter(number + 48, 2, xshift + 72, yshift, 1, 0, 0, 0);
}

void drawplayernumber(int xshift, int yshift, int number, byte shade)
{
    drawalphanumericstring("PLAYER", 2, xshift, yshift, shade, 0, 0, 0, 0);
    drawalphanumericcharacter(number + 48, 2, xshift + 42, yshift, shade, 0, 0, 0);
}

void drawlargematch(int xshift, int yshift)
{
    drawalphanumericstring("MATCH", 1, xshift, yshift, 1, 0, 0, 0, 0);
    drawalphanumericcharacter(DataReceived[10] + 48, 1, xshift + 66, yshift, 1, 0, 0, 0);
    drawalphanumericcharacter(DataReceived[11] + 48, 1, xshift + 77, yshift, 1, 0, 0, 0);
}

void drawsmallrewardblankcredits(int xshift, int yshift, int number, byte shade)
{
    byte width = 0;
    width = drawalphanumericstring("REWARD:", 2, xshift, yshift, shade, 0, 0, 0, 0);
    drawalphanumericcharacter(number + 48, 2, xshift + 45, yshift, shade, 0, 0, 0);
    drawalphanumericstring("CREDIT", 2, xshift + width + 18, yshift, shade, 0, 0, 0, 0);
    if (number >= 1)
    {
        drawalphanumericcharacter(ASCII_UPPERCASE_S, 2, xshift + 93, yshift, 1, 0, 0, 0);
    }
}

void drawsmallhighscorenumber(int xshift, int yshift, int number, byte shade)
{
    drawalphanumericcharacter(ASCII_HASHTAG, 2, xshift, yshift, shade, 0, 0, 0);
    drawalphanumericcharacter(number + 48, 2, xshift + 6, yshift, shade, 0, 0, 0);
    drawalphanumericcharacter(ASCII_COLON, 2, xshift + 12, yshift, shade, 0, 0, 0);

    //Draw letters 1-5 of initials or whatever
    drawalphanumericcharacter(HighScoreArray[number - 1][0], 2, xshift + 21, yshift, shade, 0, 0, 0);
    drawalphanumericcharacter(HighScoreArray[number - 1][1], 2, xshift + 27, yshift, shade, 0, 0, 0);
    drawalphanumericcharacter(HighScoreArray[number - 1][2], 2, xshift + 33, yshift, shade, 0, 0, 0);
    drawalphanumericcharacter(HighScoreArray[number - 1][3], 2, xshift + 39, yshift, shade, 0, 0, 0);
    drawalphanumericcharacter(HighScoreArray[number - 1][4], 2, xshift + 45, yshift, shade, 0, 0, 0);

    //Assemble High Score
    AssembledHighScores[number - 1] = 0;

    AssembledHighScores[number - 1] += HighScoreArray[number - 1][5] * 1000000000;
    AssembledHighScores[number - 1] += HighScoreArray[number - 1][6] * 100000000;
    AssembledHighScores[number - 1] += HighScoreArray[number - 1][7] * 10000000;
    AssembledHighScores[number - 1] += HighScoreArray[number - 1][8] * 1000000;
    AssembledHighScores[number - 1] += HighScoreArray[number - 1][9] * 100000;
    AssembledHighScores[number - 1] += HighScoreArray[number - 1][10] * 10000;
    AssembledHighScores[number - 1] += HighScoreArray[number - 1][11] * 1000;
    AssembledHighScores[number - 1] += HighScoreArray[number - 1][12] * 100;
    AssembledHighScores[number - 1] += HighScoreArray[number - 1][13] * 10;
    AssembledHighScores[number - 1] += HighScoreArray[number - 1][14];

    //Draw score from highscore array
    DrawReallyBigNumber(AssembledHighScores[number - 1], 2, 127, yshift, shade, 0, 0, 2, 1, 2, 0);
}

////////////////////////////////////////////////////////
//                                                    //
//                                                    //
//                   SERIAL Stuff                     //
//                                                    //
//                                                    //
////////////////////////////////////////////////////////

void CheckAndReadSerial()
{
    //Arduino can receive a maximum of 64 bytes of data in one transmission.

    //If there's not enough bytes present...
    if (Serial2.available() < 21)
    {
        return;
    }
    
    while (Serial2.available() > 21) //If there is too much data in the buffer, throw out excess data
    {
        Serial2.read();
    }

    DataReceived[0] = Serial2.read(); //Should ALWAYS return 201. If it doesn't, the batch of data is bad, and we need to wait for new data.
    if (DataReceived[0] != 201)
    {
        while (Serial.available() > 0)
        {
            Serial2.read();
        }
        return;
    }
    else
    {
        for (int x = 0; x < 20; x++)
        {
            DataReceived[x + 1] = Serial2.read();
        }
        newdata = 1;
    }

    if (newdata == 1)
    {
        //Clear all of the image-specific variables.
        CountdownBegunYet = 0;
        CountdownMillis = 0;

        AttractModeSubState = 0;
        AttractModeSubStateMillis = 0;
        
        ModeSubstate = 0;
        ModeSubstateMillis = 0;

        AttractModeStage = 0;
        HighScoreSequenceNumber = 1;

        HasItHappenedYet = 0;

        //Assemble the score
        AssembledPlayerScore = 0;

        AssembledPlayerScore += 1000000000 * DataReceived[2];
        AssembledPlayerScore += 100000000 * DataReceived[3];
        AssembledPlayerScore += 10000000 * DataReceived[4];
        AssembledPlayerScore += 1000000 * DataReceived[5];
        AssembledPlayerScore += 100000 * DataReceived[6];
        AssembledPlayerScore += 10000 * DataReceived[7];
        AssembledPlayerScore += 1000 * DataReceived[8];
        AssembledPlayerScore += 100 * DataReceived[9];
        AssembledPlayerScore += 10 * DataReceived[10];
        AssembledPlayerScore += DataReceived[11];

        newdata = 0;
    }

    for (int x = 0; x < 21; x++)
    {
        LastDataReceived[x] = DataReceived[x];
    }
    /* The old communication stuff
    //If there's not enough bytes present...
    if (Serial2.available() < 19)
    {
        return;
    }

    //In case too many bytes are present (17 is the current amount)
    //I've commented this out because it could be the cause of the DMD problems.
    while (Serial2.available() > 19)
    {
        Serial2.read();
    }

    uniquenumber = Serial2.read(); //Should ALWAYS return 201. If it doesn't, the batch of data is bad, and we need to wait for new data.
    if (uniquenumber != 201)
    {
        while (Serial.available() > 0)
        {
            Serial2.read();
        }
        return;
    }

    bytenum = 0;
    while (Serial2.available() > 8)
    {
        scoreserial[bytenum] = Serial2.read();
        bytenum++;
        newdata = 1;
    }
    mode = Serial2.read();
    currentball = Serial2.read();
    credittens = Serial2.read();
    creditones = Serial2.read();
    mpvariable = Serial2.read();
    mpvariabletwo = Serial2.read();
    mpvariablethree = Serial2.read();
    image = Serial2.read();

    if (newdata == 1)
    {
        howmanyscoredigits(); //Figure out how many score digits there are...
        if (lastdigits >= 3 && currentdigits > lastdigits + 1) //Just makes sure erroneus data wasn't recieved. (If so, the score won't be updated when the target is hit, but the next time.)
        {
            return;
        }
        drawtobufferwhatshouldbedrawntobuffer();
        newdata = 0;
    }
    */
}